Django IntegrityError-NOT NULL 제약 조건 실패

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에서 프로젝트 ID를 보내고 뷰에서 수락하고 프로젝트 클래스를 쿼리하여 개체를 가져옵니다. 내가 부족한 곳을 디버깅 할 수 없습니다.

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를 사용하여 사용자 가 기본적으로 selectHTML 에서 드롭 다운으로 렌더링 할을 선택할 수 있습니다 . 제출에 그런 다음, 양식 데이터의 각각의 ID로 백엔드에 따라 전송됩니다 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의 공식 문서는 여기에서 확인하세요.

언젠가 누군가에게 도움이되기를 바랍니다.