【问题标题】:modelform id field being passed as REQUIRED fieldmodelform id 字段作为 REQUIRED 字段传递
【发布时间】:2018-08-10 00:42:43
【问题描述】:

我正在构建的网站多次使用模型表单。到目前为止,使用 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.']}

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

【问题讨论】:

    标签: django forms field required formset


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的回答。我一直试图在文档中找到有关该信息的信息,但没有成功。你能给我指个地方读一下吗?
    • using a model formset in the template 的文档中,它说:如果您 [手动渲染字段] 并且您不使用 {% for %} 循环遍历字段,您将需要呈现主键字段.
    • 另外,值得一提的是,在表单的某处添加{{ id }}实际上是添加隐藏输入<input name="smth-0-id" value="123" id="id_smth-0-id" type="hidden">
    • 这让我疯狂了 2 天,这是一个小而关键的点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2017-02-25
    • 2018-07-03
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多