Django IntegrityError - Ràng buộc NOT NULL không thành công

Aug 31 2020

Lỗi mà tôi đang gặp phải nói rằng tôi đang cố gắng gửi biểu mẫu có trường bắt buộc trống.

lỗi

django.db.utils.IntegrityError: NOT NULL constraint failed: bug_report_bug.project_id

Mã của tôi:-

Điều tôi đang cố gắng làm là cho phép người dùng báo cáo lỗi cho bất kỳ dự án nào. Vì vậy, người dùng nhấp vào một dự án và sau đó nhận được một biểu mẫu báo cáo lỗi, nơi họ có thể báo cáo lỗi. Mọi lỗi đều được kết nối với dự án của nó.

Models.py

class Bug(models.Model):
    reported_by: models.ForeignKey(User, on_delete=models.CASCADE)
    project = models.OneToOneField(Project, on_delete=models.CASCADE)
    bug_title = models.CharField(max_length=150)
    bug_description = models.TextField()
    screenshot = models.ImageField(blank=True, null=True, upload_to='Bug_Reports')
    date_posted = models.DateTimeField(default=timezone.now)


    def __str__(self):
        return 'Project: {}\nBug: {}'.format(self.project.title, self.bug_title)
    
    def get_absolute_url(self):
        return reverse("bugReport", kwargs={"pk": self.pk})
   

Forms.py

class BugReportForm(forms.ModelForm):
    class Meta:
        model = Bug
        fields = ('bug_title', 'bug_description', 'screenshot')

Views.py

def bug_register(request, pk):
    if request.method == 'POST':
        form = BugReportForm(request.POST)
        if form.is_valid():
            form.project = Project.objects.get(pk=int(pk))
            form.user = request.user
            print(form.project.id)
            form.save()
            messages.success(request, f'Thankyou for Reporting! We will review your issue and revert back soon,')
            return redirect('home')
        else:
            messages.warning(request, f'Please fill all the mandatory fields!')
    else:
        form = BugReportForm()
    return render(request, 'bug_report/report.html', {'form': form})

Như bạn có thể thấy, tôi đang gửi id của dự án trong URL và sau đó chấp nhận nó trong các khung nhìn và truy vấn lớp dự án để lấy đối tượng. Tôi không thể gỡ rối nơi tôi thiếu.

http://127.0.0.1:8000/bugreport/1/

Lỗi cho biết điền vào trường mà tôi không thể hiểu được vì tôi chưa điền. Ngoài ra, trong khi sử dụng biểu mẫu bảng điều khiển quản trị, tôi có thể báo cáo bất kỳ lỗi nào ở đó.

Trả lời

1 AnubhavUjjawal Aug 31 2020 at 02:26

Các liên kết sau chứa tài liệu và ví dụ mã về cách thêm trường khóa ngoại vào biểu mẫu django:

  • https://stackoverflow.com/a/5708772/13499618
  • https://docs.djangoproject.com/en/3.1/ref/forms/fields/#django.forms.ModelChoiceField

Về cơ bản, bạn sẽ sử dụng một django.forms.ModelChoiceFieldđể cho phép người dùng của mình chọn một cái sẽ hiển thị dưới dạng trình đơn selectthả xuống trong HTML theo mặc định. Sau đó, khi gửi, dữ liệu biểu mẫu sẽ được gửi tương ứng đến phần phụ trợ với id tương ứng của Projecttrong BugFormform.save()sẽ hoạt động.

Jobizil Nov 17 2020 at 00:00

Gần đây tôi đã gặp vấn đề như vậy, sau khi tìm kiếm nhiều trên tài liệu chính thức của SO, DRF tại đây và các diễn đàn khác, tôi thấy một nhận xét đơn giản gợi ý rằng hãy bỏ toàn bộ thư mục di chuyển và thực hiện di chuyển lại. Đây là một lệnh đơn giản để xóa thư mục di chuyển trong dự án của bạn:

rm -f db.sqlite3
rm -r <your_app_name>/migrations
python manage.py makemigrations <your_app_name>
python manage.py migrate

Xem tài liệu chính thức của djanjo-rest-framework tại đây

Tôi hy vọng điều này sẽ giúp ai đó một ngày nào đó.