简体   繁体   English

NOT NULL 约束失败,在 mixin 表单上

[英]NOT NULL constraint failed, on mixin forms

thanks for your time.谢谢你的时间。

i've got a model(Servicos) that got a linked images model (Imagens) to his.我有一个模型(Servicos),它有一个链接的图像模型(Imagens)到他的。 The Servicos model is a foreign key to a model call (Parceiros) and Parceiros is linked to the user Model. Servicos 模型是模型调用 (Parceiros) 的外键,Parceiros 链接到用户模型。 my user_create and parceiros_create views works fine.我的 user_create 和 parceiros_create 视图工作正常。 although the Servicos model forms is displayed with the ImageFormSet (a form to add 4 images at once) and when i try to save the Servicos Form (at admin works fine) but on template i get this error :尽管 Servicos 模型表单与 ImageFormSet(一种一次添加 4 个图像的表单)一起显示,并且当我尝试保存 Servicos 表单(在管理员工作正常)但在模板上我收到此错误:

NOT NULL constraint failed: services_servicos.parceiro_id NOT NULL 约束失败:services_servicos.parceiro_id

and point to the line :并指向该行:

service.save()

i've already tried to set the service.save(parceiros=Parceiros.id), change the foreign key to user (on a test project), and quite other things我已经尝试设置 service.save(parceiros=Parceiros.id),将外键更改为用户(在测试项目中),以及其他很多东西

it should save the Servicos object to the Parceiros instance that is logged in. i'm not quite shure if am i calling the Parceiro object right它应该将 Servicos 对象保存到登录的 Parceiros 实例。我不太确定我是否正确调用 Parceiro 对象

models.py:模型.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)

views.py:视图.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)

the solution was to call the Parceiros object trough the request user (i guess because its a onetoOne field with the User model):解决方案是通过请求用户调用 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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM