Django IntegrityError - NOT NULL kısıtlaması başarısız oldu
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
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.
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.