Django IntegrityError - NOT NULL constraint ล้มเหลว

Aug 31 2020

ข้อผิดพลาดที่ฉันพบบอกว่าฉันกำลังส่งแบบฟอร์มที่มีช่องว่างที่จำเป็น

ข้อผิดพลาด

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

รหัสของฉัน: -

สิ่งที่ฉันพยายามทำคือให้ผู้ใช้รายงานข้อบกพร่องของโครงการใด ๆ ดังนั้นผู้ใช้จึงคลิกที่โปรเจ็กต์จากนั้นจะได้รับแบบฟอร์มรายงานข้อบกพร่องซึ่งเขา / เธอสามารถรายงานข้อบกพร่องได้ ทุกข้อบกพร่องเชื่อมต่อกับโครงการ

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

ดังที่คุณเห็นว่าฉันกำลังส่งรหัสของโครงการใน URL จากนั้นยอมรับในมุมมองและการสอบถามคลาสโครงการเพื่อรับวัตถุ ฉันไม่สามารถแก้ไขข้อบกพร่องที่ฉันขาดได้

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

ข้อผิดพลาดระบุว่าให้กรอกข้อมูลในช่องที่ฉันไม่เข้าใจเนื่องจากยังไม่ได้ทำ นอกจากนี้ในขณะที่ใช้แบบฟอร์มแดชบอร์ดผู้ดูแลระบบฉันสามารถรายงานข้อบกพร่องที่นั่นได้

คำตอบ

1 AnubhavUjjawal Aug 31 2020 at 02:26

ลิงก์ต่อไปนี้ประกอบด้วยเอกสารและตัวอย่างโค้ดเกี่ยวกับวิธีการเพิ่มฟิลด์คีย์นอกลงในฟอร์ม django:

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

โดยทั่วไปคุณจะใช้ a django.forms.ModelChoiceFieldเพื่ออนุญาตให้ผู้ใช้ของคุณเลือกสิ่งที่จะแสดงเป็นselectรายการแบบเลื่อนลงใน HTML ตามค่าเริ่มต้น จากนั้นในการส่งข้อมูลแบบฟอร์มจะถูกส่งตามไปยังแบ็กเอนด์พร้อมกับรหัสตามลำดับของProjectในBugFormและform.save()จะใช้งานได้

Jobizil Nov 17 2020 at 00:00

ฉันเพิ่งเจอปัญหาดังกล่าวหลังจากค้นหาอย่างกว้างขวางใน SO เอกสารทางการ DRF ที่นี่และฟอรัมอื่น ๆ ฉันเห็นความคิดเห็นง่ายๆที่แนะนำให้ทิ้งโฟลเดอร์การย้ายข้อมูลทั้งหมดและทำการย้ายอีกครั้ง นี่คือคำสั่งง่ายๆในการลบโฟลเดอร์การย้ายข้อมูลในโครงการของคุณ:

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

ดูเอกสารอย่างเป็นทางการของ djanjo-rest-framework ที่นี่

ฉันหวังว่านี่จะช่วยใครสักคนได้ในสักวัน