Django IntegrityError - NOT NULL-Einschränkung fehlgeschlagen
Der Fehler, mit dem ich konfrontiert bin, besagt, dass ich versuche, ein Formular mit einem leeren erforderlichen Feld einzureichen.
Error
django.db.utils.IntegrityError: NOT NULL constraint failed: bug_report_bug.project_id
Mein Code: -
Ich versuche, Benutzern das Melden von Fehlern für ein Projekt zu ermöglichen. Der Benutzer klickt also auf ein Projekt und erhält dann ein Fehlerberichtformular, in dem er den Fehler melden kann. Jeder Fehler ist mit seinem Projekt verbunden.
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})
Wie Sie sehen können, sende ich die ID des Projekts in der URL und akzeptiere sie dann in Ansichten und frage die Projektklasse ab, um das Objekt abzurufen. Ich kann nicht debuggen, wo es mir fehlt.
http://127.0.0.1:8000/bugreport/1/
Der Fehler besagt, dass ein Feld ausgefüllt werden muss, das ich nicht verstehen kann, da ich es nicht erstellt habe. Auch während ich das Admin-Dashboard-Formular verwende, kann ich dort jeden Fehler melden.
Antworten
Die folgenden Links enthalten Dokumentation und Codebeispiele zum Hinzufügen eines Fremdschlüsselfelds zu einem Django-Formular:
- https://stackoverflow.com/a/5708772/13499618
- https://docs.djangoproject.com/en/3.1/ref/forms/fields/#django.forms.ModelChoiceField
Grundsätzlich würden Sie a verwenden django.forms.ModelChoiceField, damit Ihre Benutzer ein auswählen können, das selectstandardmäßig als Dropdown-Liste in HTML gerendert wird. Beim Senden werden die Formulardaten dann entsprechend an das Backend mit der jeweiligen ID des Projectin gesendet BugFormund form.save()funktionieren.
Ich bin kürzlich auf ein solches Problem gestoßen, nachdem ich ausgiebig in SO, der offiziellen DRF-Dokumentation hier und anderen Foren gesucht hatte. Ich sah einen einfachen Kommentar, der vorschlug, den gesamten Migrationsordner zu löschen und die Migrationen erneut durchzuführen. Hier ist ein einfacher Befehl zum Entfernen des Migrationsordners in Ihrem Projekt:
rm -f db.sqlite3 rm -r <your_app_name>/migrations python manage.py makemigrations <your_app_name> python manage.py migrate
Die offizielle Dokumentation des Djanjo-Rest-Frameworks finden Sie hier
Ich hoffe das hilft jemandem eines Tages.