Django IntegrityError - Ошибка ограничения NOT NULL
Ошибка, с которой я столкнулся, говорит о том, что я пытаюсь отправить форму с пустым обязательным полем.
ошибка
django.db.utils.IntegrityError: NOT NULL constraint failed: bug_report_bug.project_id
Мой код: -
Я пытаюсь дать пользователям возможность сообщать об ошибках в любом проекте. Таким образом, пользователь нажимает на проект, а затем получает форму отчета об ошибке, в которой он / она может сообщить об ошибке. Каждая ошибка связана со своим проектом.
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})
Как видите, я отправляю идентификатор проекта в URL-адресе, а затем принимаю его в представлениях и запрашиваю класс проекта, чтобы получить объект. Я не могу отлаживать то, чего мне не хватает.
http://127.0.0.1:8000/bugreport/1/
Ошибка говорит о заполнении поля, которое я не могу понять, поскольку я этого не сделал. Также при использовании формы панели администратора я могу сообщить о любой ошибке.
Ответы
Следующие ссылки содержат документацию и примеры кода о том, как добавить поле внешнего ключа в форму django:
- https://stackoverflow.com/a/5708772/13499618
- https://docs.djangoproject.com/en/3.1/ref/forms/fields/#django.forms.ModelChoiceField
В основном вы должны использовать a, django.forms.ModelChoiceFieldчтобы позволить своим пользователям выбирать, который selectпо умолчанию будет отображаться в виде раскрывающегося списка в HTML. Затем при отправке данные формы будут отправлены в серверную часть с соответствующим идентификатором Projectв BugForm, и form.save()будут работать.
Недавно я столкнулся с такой проблемой, после тщательного поиска в официальной документации SO, DRF здесь и на других форумах я увидел простой комментарий, в котором предлагалось удалить всю папку миграции и снова выполнить миграции. Вот простая команда для удаления папки миграции в вашем проекте:
rm -f db.sqlite3 rm -r <your_app_name>/migrations python manage.py makemigrations <your_app_name> python manage.py migrate
См. Официальную документацию djanjo-rest-framework здесь
Я надеюсь, что это когда-нибудь поможет кому-нибудь.