Django IntegrityError - Falha na restrição NOT NULL
O erro que estou enfrentando diz que estou tentando enviar um formulário com o campo obrigatório vazio.
Erro
django.db.utils.IntegrityError: NOT NULL constraint failed: bug_report_bug.project_id
Meu código: -
O que estou tentando fazer é permitir que os usuários relatem bugs em qualquer projeto. Assim, o usuário clica em um projeto e obtém um formulário de relatório de bug, onde pode relatar o bug. Cada bug está conectado ao seu projeto.
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})
Como você pode ver, estou enviando o id do projeto na URL e, em seguida, aceitando-o nas visualizações e consultando a classe do projeto para obter o objeto. Não sou capaz de depurar onde estou faltando.
http://127.0.0.1:8000/bugreport/1/
O erro diz para preencher um campo que não consigo entender porque não o fiz. Além disso, ao usar o formulário do painel de administração, posso relatar qualquer bug lá.
Respostas
Os links a seguir contêm documentação e exemplos de código sobre como adicionar um campo de chave estrangeira a um formulário django:
- https://stackoverflow.com/a/5708772/13499618
- https://docs.djangoproject.com/en/3.1/ref/forms/fields/#django.forms.ModelChoiceField
Basicamente, você usaria um django.forms.ModelChoiceFieldpara permitir que seus usuários selecionem um que será renderizado como um selectmenu suspenso em HTML por padrão. Depois, no envio, os dados do formulário serão enviados de acordo com o back-end com o respectivo id do Projectno BugForm, e form.save()funcionará.
Recentemente me deparei com esse problema, depois de pesquisar extensivamente na documentação oficial do SO, DRF aqui e em outros fóruns, vi um comentário simples que sugeria descartar toda a pasta de migrações e fazer as migrações novamente. Este é um comando simples para remover a pasta de migração em seu projeto:
rm -f db.sqlite3 rm -r <your_app_name>/migrations python manage.py makemigrations <your_app_name> python manage.py migrate
Veja a documentação oficial do djanjo-rest-framework aqui
Espero que isso ajude alguém algum dia.