我正在构建的网站多次使用模型。到目前为止,使用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.']}
显然,我还没有将自己的身份设置为选择字段,因为我根本没有设置它。它会自动生成。我慢慢疯了!任何帮助都会受到欢迎。
答案 0 :(得分:3)
模型表单集需要id
字段,您必须将其包含在模板中。也许您之前使用的是单独的模型表单,而不是必需的。