Django IntegrityError - Vincolo NOT NULL non riuscito

Aug 31 2020

L'errore che sto affrontando dice che sto cercando di inviare un modulo con un campo obbligatorio vuoto.

Errore

django.db.utils.IntegrityError: NOT NULL constraint failed: bug_report_bug.project_id

Il mio codice: -

La cosa che sto cercando di fare è consentire agli utenti di segnalare bug per qualsiasi progetto. Quindi l'utente fa clic su un progetto e quindi ottiene un modulo di segnalazione di bug in cui può segnalare il bug. Ogni bug è collegato al suo progetto.

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})

Come puoi vedere, sto inviando l'ID del progetto in URL e quindi lo accetto nelle viste e sto interrogando la classe del progetto per ottenere l'oggetto. Non sono in grado di eseguire il debug dove mi manca.

http://127.0.0.1:8000/bugreport/1/

L'errore dice di compilare un campo che non riesco a capire perché non l'ho fatto. Inoltre, durante l'utilizzo del modulo del dashboard di amministrazione, sono in grado di segnalare eventuali bug lì.

Risposte

1 AnubhavUjjawal Aug 31 2020 at 02:26

I seguenti collegamenti contengono documentazione ed esempi di codice su come aggiungere un campo chiave esterna a un modulo django:

  • https://stackoverflow.com/a/5708772/13499618
  • https://docs.djangoproject.com/en/3.1/ref/forms/fields/#django.forms.ModelChoiceField

Fondamentalmente useresti a django.forms.ModelChoiceFieldper consentire ai tuoi utenti di selezionare un che verrà visualizzato come un selectmenu a discesa in HTML per impostazione predefinita. Quindi, al momento dell'invio, i dati del modulo verranno inviati di conseguenza al back-end con il rispettivo id del Projectin BugForm, e form.save()funzioneranno.

Jobizil Nov 17 2020 at 00:00

Recentemente mi sono imbattuto in questo problema, dopo aver cercato a lungo su SO, nella documentazione ufficiale di DRF qui e in altri forum, ho visto un semplice commento che suggeriva di eliminare l'intera cartella delle migrazioni e ripetere le migrazioni. Ecco un semplice comando per rimuovere la cartella di migrazione nel tuo progetto:

rm -f db.sqlite3
rm -r <your_app_name>/migrations
python manage.py makemigrations <your_app_name>
python manage.py migrate

Vedi la documentazione ufficiale di djanjo-rest-framework qui

Spero che questo aiuti qualcuno un giorno.