Django IntegrityError - NOT NULL kısıtlaması başarısız oldu

Aug 31 2020

Karşılaştığım hata, zorunlu alanı boş olan bir form göndermeye çalıştığımı söylüyor.

Hata

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

Kodum: -

Yapmaya çalıştığım şey, kullanıcıların herhangi bir proje için hataları bildirmesini sağlamak. Böylece kullanıcı bir projeye tıklar ve ardından hatayı bildirebileceği bir hata raporu formu alır. Her hata kendi projesine bağlıdır.

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

Gördüğünüz gibi URL'de projenin kimliğini gönderiyorum ve ardından görünümlerde kabul ediyorum ve nesneyi almak için proje sınıfını sorguluyorum. Eksik olduğum yerde hata ayıklayamıyorum.

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

Hata, yapmadığım için anlayamadığım bir alanı doldurmamı söylüyor. Ayrıca yönetici kontrol paneli formunu kullanırken orada herhangi bir hata bildirebiliyorum.

Yanıtlar

1 AnubhavUjjawal Aug 31 2020 at 02:26

Aşağıdaki bağlantılar, django formuna bir yabancı anahtar alanının nasıl ekleneceğine ilişkin belgeleri ve kod örneklerini içerir:

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

django.forms.ModelChoiceFieldKullanıcılarınızın selectvarsayılan olarak HTML'de açılır menü olarak görüntülenecek olanı seçmesine izin vermek için temelde a kullanırsınız . Göndermek üzerinde Ardından, form verileri ilgili kimliği ile arka uç buna göre gönderilecektir Projectiçinde BugFormve form.save()çalışacaktır.

Jobizil Nov 17 2020 at 00:00

Kısa süre önce böyle bir sorunla karşılaştım, burada SO, DRF resmi belgelerinde ve diğer forumlarda kapsamlı bir şekilde arama yaptıktan sonra, tüm taşıma klasörünü kaldırmayı ve geçişleri yeniden yapmayı öneren basit bir yorum gördüm. İşte projenizdeki geçiş klasörünü kaldırmak için basit bir komut:

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

Djanjo-rest-framework'ün resmi belgelerine buradan bakın

Umarım bu bir gün birine yardımcı olur.