Django IntegrityError - La contrainte NOT NULL a échoué

Aug 31 2020

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

1 AnubhavUjjawal Aug 31 2020 at 02:26

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.

Jobizil Nov 17 2020 at 00:00

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.