فرض کنید میخایم توی یک Model تو جنگو بگیم که مجموع سه تا فیلد باید یکتا باشه. برای این کار توی django.models.Model یک قابلیت تعریف شده:
1 2 3 4 5 6 7 8 9 10 |
class Document(models.Model): . . . . class Meta: unique_together = ("system", "doc_type", "docdate") db_table = "document" |
ولی مساله اینه که اینجا ارور در سطح دیتابیس نشون میده و جاهای مختلف باید این Excelption رو هندل کنید. اینطوری نیست که خودش هندل کنه. مثلا
1 2 3 4 5 6 7 8 9 10 |
try: doc = Document.objects.create( system_id=service_obj.id, doc_type=0 if doctype == 'SAD' else 1, docdate=docdate, status=status, ) except DatabaseError as e: print(f"*****************{batch}") print(e) |
همینطور باید توی view این موضوع رو خودمون هندل کنیم و قبل از ارسال درخواست به دیتابیس حتما چک کنیم ترکیب این سه فیلد تکراری توی دیتابیس نباشه
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
dev doc_view(request): . . . . if Document.objects.filter(system=service, doc_type=doc_type, docdate=document_form_instance.docdate).exists(): document_form.add_error(None, ".....") else: document_form_instance.save() return redirect('man:management_documents_document_detail', doc_id=document_form_instance.id) . . |
و برای اینکه ارور رو توی template قشنگتر نشون بده مثل زیر عمل کنیم
1 2 3 4 5 6 7 8 9 |
{% if document_form.errors %} <li class="list-group-item border-5"> <div class="alert alert-danger" role="alert"> {% for error in document_form.non_field_errors %} {{ error }} {% endfor %} </div> </li> {% endif %} |