Django IntegrityError - batasan NOT NULL gagal

Aug 31 2020

Kesalahan yang saya hadapi mengatakan bahwa saya sedang mencoba untuk mengirimkan formulir dengan bidang wajib kosong.

Kesalahan

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

Kode Saya: -

Hal yang saya coba lakukan adalah memungkinkan pengguna melaporkan bug untuk salah satu proyek. Jadi pengguna mengklik sebuah proyek dan kemudian mendapatkan formulir laporan bug di mana dia dapat melaporkan bug tersebut. Setiap bug terhubung ke proyeknya.

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

Seperti yang Anda lihat, saya mengirim id proyek di URL dan kemudian menerimanya dalam tampilan dan meminta kelas proyek untuk mendapatkan objek. Saya tidak dapat men-debugg di mana saya kurang.

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

Kesalahan mengatakan untuk mengisi bidang saya tidak dapat mengerti karena saya belum berhasil. Juga saat menggunakan formulir dasbor admin, saya dapat melaporkan bug apa pun di sana.

Jawaban

1 AnubhavUjjawal Aug 31 2020 at 02:26

Tautan berikut berisi dokumentasi dan contoh kode tentang bagaimana menambahkan field kunci asing ke formulir django:

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

Pada dasarnya Anda akan menggunakan a django.forms.ModelChoiceFielduntuk memungkinkan pengguna Anda memilih yang akan ditampilkan sebagai selectdropdown dalam HTML secara default. Kemudian, pada saat submit, data formulir akan dikirim sesuai ke backend dengan id masing-masing Projectdi BugForm, dan form.save()akan berfungsi.

Jobizil Nov 17 2020 at 00:00

Saya baru-baru ini menemukan masalah seperti itu, setelah mencari secara ekstensif di SO, dokumentasi resmi DRF di sini dan forum lain, saya melihat komentar sederhana yang menyarankan untuk membuang seluruh folder migrasi dan melakukan migrasi lagi. Berikut adalah perintah sederhana untuk menghapus folder migrasi dalam proyek Anda:

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

Lihat dokumentasi resmi djanjo-rest-framework di sini

Saya harap ini membantu seseorang suatu hari nanti.