将modelform id字段作为REQUIRED字段

时间:2018-03-01 20:36:35

标签: django forms field required formset

我正在构建的网站多次使用模型。到目前为止,使用is_valid验证表单的过程非常顺利。现在,我创建的新模型已经确定id字段(为模型表单自动生成)是必填字段。我在模板中手动渲染字段,而不是渲染id字段。到目前为止,这对我的任何模型都不是问题,因为它从未被注册为必填字段。但是,对于这个有问题的模型,由于我没有渲染字段,因此它返回为空,因此不会通过验证。

我意识到我可以通过渲染字段来解决问题,但我想了解这里发生的事情。为什么它似乎是随机决定需要id?

以下是有问题的模型:

class Item(models.Model):
    budgetcatagory=models.ForeignKey(BudgetCatagory, on_delete=models.CASCADE)
    name=models.CharField(max_length=30)
    enName=models.CharField(max_length=30, default ="")
    detail=models.CharField(max_length=30)
    layout=models.CharField(max_length=30, default="normal")
    unit=models.CharField(max_length=30)
    unit_description=models.CharField(max_length=30, default="")
    unit_price=models.IntegerField(default=0)
    QTY=models.IntegerField(default=0)
    param1=models.CharField(max_length=30, blank=True)
    param2=models.CharField(max_length=30, blank=True)
    param3=models.CharField(max_length=30, blank=True)
    param4=models.IntegerField(default=0)
    parent=models.CharField(max_length=30, default = "0")
    cost_ave=models.IntegerField(default=0, blank=True)
    cost_min=models.IntegerField(default=0, blank=True)
    cost_max=models.IntegerField(default=0, blank=True)
    total_cost=models.IntegerField(default=0)
    choiceList=(
            ('choice1',param1),
            ('choice2',param2),
    )
    ItemChoice=models.CharField(
        max_length=10,
        choices=choiceList,
        default='',
    )
    objects=ItemManager()

    def __str__(self):
        return self.name

以下是我在发送到模板之前填充表单的方法:

else:
    #populate
    I=Item.objects.filter(budgetcatagory__user_id=U.id)
    C=BudgetCatagory.objects.filter(user_id=U.id)

    #initiate initial catagories and items for new user
    if (not I.exists()) or (not C.exists()):
        Item.objects.filter(budgetcatagory__user_id=U.id).delete()
        BudgetCatagory.objects.filter(user_id=U.id).delete()
        InitiateNewUser(U)
        I=Item.objects.filter(budgetcatagory__user_id=U.id)
        C=BudgetCatagory.objects.filter(user_id=U.id)
    FormsetItem=ItemFormSet(queryset=I)
    FormsetCat=CatFormset(queryset=C)

return render(request,'getdata/budgetmachine.html', {'FormsetItem':FormsetItem, 'FormsetCat':FormsetCat })

以下是我从POST填充表单的方式:

if request.method=='POST':
            #Save
            FormsetItem=ItemFormSet(request.POST,queryset=Item.objects.filter(budgetcatagory__user_id=U.id))
            FormsetCat=CatFormset(request.POST)
            if FormsetItem.is_valid():

我好几天都不顾一切。任何帮助,将不胜感激。 感谢

编辑:

Alasdair,根据您的回答,我自动渲染了整个表单集{{formset}},以确保呈现所有必需的字段。由于更奇怪的原因,它现在无法验证:

 {'id': ['Select a valid choice. That choice is not one of the available choices.']}

显然,我还没有将自己的身份设置为选择字段,因为我根本没有设置它。它会自动生成。我慢慢疯了!任何帮助都会受到欢迎。

1 个答案:

答案 0 :(得分:3)

模型表单集需要id字段,您必须将其包含在模板中。也许您之前使用的是单独的模型表单,而不是必需的。