Django IntegrityError - La contrainte NOT NULL a échoué
L'erreur à laquelle je suis confronté indique que j'essaie de soumettre un formulaire avec un champ obligatoire vide.
Erreur
django.db.utils.IntegrityError: NOT NULL constraint failed: bug_report_bug.project_id
Mon code: -
La chose que j'essaye de faire est de permettre aux utilisateurs de signaler des bogues pour n'importe lequel d'un projet. Ainsi, l'utilisateur clique sur un projet et obtient ensuite un formulaire de rapport de bogue où il / elle peut signaler le bogue. Chaque bug est connecté à son projet.
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})
Comme vous pouvez le voir, j'envoie l'identifiant du projet dans l'URL, puis je l'accepte dans les vues et j'interroge la classe de projet pour obtenir l'objet. Je ne suis pas en mesure de déboguer où je manque.
http://127.0.0.1:8000/bugreport/1/
L'erreur dit de remplir un champ que je ne comprends pas car je ne l'ai pas fait. En utilisant le formulaire de tableau de bord d'administration, je suis également en mesure de signaler tout bogue.
Réponses
Les liens suivants contiennent de la documentation et des exemples de code sur la façon d'ajouter un champ de clé étrangère à un formulaire django:
- https://stackoverflow.com/a/5708772/13499618
- https://docs.djangoproject.com/en/3.1/ref/forms/fields/#django.forms.ModelChoiceField
Vous utiliseriez essentiellement a django.forms.ModelChoiceFieldpour permettre à vos utilisateurs de sélectionner un qui s'affichera sous forme de selectliste déroulante en HTML par défaut. Ensuite, lors de la soumission, les données du formulaire seront envoyées en conséquence au backend avec l'identifiant respectif du Projectdans le BugForm, et form.save()fonctionneront.
Je suis récemment tombé sur un tel problème, après avoir longuement cherché sur SO, la documentation officielle DRF ici et d'autres forums, j'ai vu un simple commentaire suggérant de supprimer tout le dossier des migrations et de refaire les migrations. Voici une commande simple pour supprimer le dossier de migration de votre projet:
rm -f db.sqlite3 rm -r <your_app_name>/migrations python manage.py makemigrations <your_app_name> python manage.py migrate
Voir la documentation officielle de djanjo-rest-framework ici
J'espère que cela aidera quelqu'un un jour.