python - 在 mixin 表单上,NOT NULL 约束失败
问题描述
谢谢你的时间。
我有一个模型(Servicos),它有一个链接图像模型(Imagens)到他的。Servicos 模型是模型调用 (Parceiros) 的外键,Parceiros 链接到用户模型。我的 user_create 和 parceiros_create 视图工作正常。虽然 Servicos 模型表单与 ImageFormSet 一起显示(一次添加 4 个图像的表单),当我尝试保存 Servicos 表单(在管理员下工作正常)但在模板上我收到此错误:
NOT NULL 约束失败:services_servicos.parceiro_id
并指向行:
service.save()
我已经尝试设置 service.save(parceiros=Parceiros.id),将外键更改为用户(在测试项目中),以及其他一些事情
它应该将 Servicos 对象保存到已登录的 Parceiros 实例中。如果我正确调用 Parceiro 对象,我不太确定
模型.py:
get_user_model = User
class Parceiros (models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
nome = models.CharField(max_length=200)
endereco = models.TextField(max_length=400, blank=True)
responsavel = models.CharField(max_length=100)
tel = PhoneField(max_length=12)
created_at = models.DateTimeField(auto_now=True)
updated_at = models.DateTimeField(auto_now_add=True, blank=True)
ativo = models.BooleanField(default=False)
def get_queryset(self):
queryset = super(Parceiros, self).get_queryset()
return queryset
def __str__(self):
return '%s %s' % (self.user, self.nome)
def get_absolute_url(self):
return reverse('parceiro_detail2', kwargs={'pk': self.pk})
class Servicos (models.Model):
parceiro = models.ForeignKey(Parceiros, on_delete=models.CASCADE, related_name='servi')
tipo = models.CharField(max_length=200)
objetivo = models.TextField(max_length=500, blank=True)
preco = models.DecimalField(max_digits=9, decimal_places=2, blank=True)
telefone = PhoneField(max_length=12, default='21968151502')
def get_image_filename(instance, filename):
tipo = instance.servicos.tipo
slug = slugify(tipo)
return "servicos_imagens/%s-%s" % (slug, filename)
def __str__(self):
return '%s %s' % (self.tipo, self.parceiro)
class Imagens (models.Model):
servicos = models.ForeignKey(Servicos, on_delete=models.CASCADE, related_name='images')
imagem = models.ImageField(upload_to=get_image_filename)
视图.py:
@login_required
def service_create(request):
ImageFormSet = modelformset_factory(Imagens, fields=('imagem',), extra=4)
if request.method == 'POST':
form = ServicosForm(request.POST)
formset = ImageFormSet(request.POST or None, request.FILES)
if form.is_valid() and formset.is_valid():
service = form.save(commit=False)
service.save()
for f in formset:
try:
photo = Imagens(servicos=service, imagem=f.cleaned_data['imagem'])
photo.save()
except Exception as e:
break
return redirect(reverse('parceiro_detail2', kwargs={'service': service.id}))
else:
form = ServicosForm()
formset = ImageFormSet(queryset=Imagens.objects.none())
context = {
'form': form,
'formset': formset,
}
return render(request, 'servicoform.html', context)
解决方案
解决方案是通过请求用户调用 Parceiros 对象(我猜是因为它是带有 User 模型的 onetoOne 字段):
if request.method == 'POST':
form = ServicosForm(request.POST)
formset = ImageFormSet(request.POST or None, request.FILES)
if form.is_valid() and formset.is_valid():
service = form.save(commit=False)
service.parceiro = request.user.parceiros
service.save()
推荐阅读
- python - Python tkinter 应用程序中的奇怪错误
- go - `go mod vendor` 命令的目的是什么?
- java - 如何检查作为字节数组发送的文件的类型/名称?
- google-analytics - GA4 的用户 ID 配置。在用户 ID 可用之前,是否应将 DataLayer 中的用户 ID 字段留空?
- python - Pandas set_td_classes 不适用于所有列
- javascript - 每次更新代码时都硬刷新页面
- android - 如何将项目拖放到 android studio June 2021 4.2.2 版本中
- android - NavigationComponent - NavGraph 的 id
- java - 为什么我们不必在 Java Spring Boot 中使用 Autowired?
- python-3.x - 如何对从查询集多对多字段中提取的列表进行分组?