Django IntegrityError - Ràng buộc NOT NULL không thành công
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
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 BugFormvà form.save()sẽ hoạt động.
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 đó.