Modelform

时间:2016-01-10 22:11:56

标签: python django validation django-forms

所以我想写下我的第一个"认真的" Web应用程序Python / Django。到目前为止,非常好,大部分时间都喜欢它,即使我仍然遇到非常愚蠢的问题,所以请耐心等待。

我尝试编写一个编辑某个模型的例程。我构建了一个ModelForm和一个简单的相应视图。该表单收集数据并正确显示,但我提交了任何更改,但未在与IntegerField关联的choices上进行验证。这很傻,但我被卡住了。

我的模特(相关部分):

class Fretes(models.Model):

    MOD_FRETE = (
        ('0', 'POR CONTA DO EMITENTE'),
        ('1', 'POR CONTA DO DESTINATARIO'),
    )

    frete_id = models.AutoField(primary_key=True)
    remetente_id = models.IntegerField(blank=True, null=True)
    destinatario_id = models.IntegerField(blank=True, null=True)
    endereco_remetente_id = models.IntegerField(blank=True, null=True)
    endereco_destinatario_id = models.IntegerField(blank=True, null=True)
    frete_por_conta = models.IntegerField(blank=True, null=True, choices=MOD_FRETE)
    criado = models.DateTimeField(auto_now_add=True)
    modificado = models.DateTimeField(auto_now=True)
    valor_frete = models.DecimalField(max_digits=9, decimal_places=2)

我的表格(相关部分):

class FretesForm(forms.ModelForm):

    class Meta:
        model = Fretes
        fields = ['valor_frete','frete_por_conta','apolice']

我的观点(相关部分):

def mudaFrete(request, id):

    frete = get_object_or_404(Fretes, pk=id)
    if request.POST:
        frete = FretesForm(request.POST, prefix='f1', instance=frete)
        if frete.is_valid():
            frete_salvo = frete.save()
            msg_erro = "FORM SALVO!"
        else:
            msg_erro = "ERRO AO TENTAR SALVAR FORM!"
        return render(request,"templates/mudafrete.html", 
                {'frete' : frete,
                 'msg_erro' : msg_erro })
    else:
        fFrete = FretesForm(prefix="f1", instance=frete)

        return render(request,"template/mudafrete.html",
                {'frete' : fFrete})

正如我所说的,这段代码加载数据OK,但是如果我尝试更改任何字段,则验证失败,告诉我来自" frete_por_conta"无效(返回"做出有效选择.0(或任何其他有效价值)不是可用选项之一" - 从葡萄牙语免费翻译)

据我了解,它不应该通过任何验证,因为它从模型中的choices中选择了选项,但我显然遗漏了一些东西......

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

如果它是IntegerField,则选项应该是整数,而不是字符串。

MOD_FRETE = (
    (0, 'POR CONTA DO EMITENTE'),
    (1, 'POR CONTA DO DESTINATARIO'),
)