Django IntegrityError - Ошибка ограничения NOT NULL

Aug 31 2020

Ошибка, с которой я столкнулся, говорит о том, что я пытаюсь отправить форму с пустым обязательным полем.

ошибка

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/

Ошибка говорит о заполнении поля, которое я не могу понять, поскольку я этого не сделал. Также при использовании формы панели администратора я могу сообщить о любой ошибке.

Ответы

1 AnubhavUjjawal Aug 31 2020 at 02:26

Следующие ссылки содержат документацию и примеры кода о том, как добавить поле внешнего ключа в форму 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()будут работать.

Jobizil Nov 17 2020 at 00:00

Недавно я столкнулся с такой проблемой, после тщательного поиска в официальной документации 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 здесь

Я надеюсь, что это когда-нибудь поможет кому-нибудь.