我有一个模特:
class Order(models.Model):
order_type = models.ForeignKey(OrderType)
quantity = models.IntegerField(max_digits=10, decimal_places=4)
product = models.ForeignKey(Product)
我添加了动态提交的表单:
class OrderForm(ModelForm):
class Meta:
model = Order
fields = [
'order_type', 'product'
]
widgets = {
'order_type': Select(attrs={'class': 'form-control'}),
'product': Select(attrs={'class': 'form-control'}),
}
def __init__(self, types=[],*args, **kwargs):
super(OrderForm, self).__init__(*args, **kwargs)
if "AMOUNT" in types:
self.fields['quantity'] = IntegerField(
NumberInput(attrs={'class': 'form-control'})
)
在CreateView
我覆盖帖子。在前端我发送带有数据的ajax(如果发送了数据,我想生成带有附加数量字段的表单),那么我用这个新表单替换旧表单:
class OrderCreateView(CreateView):
model = Order
form_class = OrderForm
def post(self, request, *args, **kwargs):
self.object = None
d = request.POST.get('DATA', None)
if d is not None:
form = self.form_class(
types=["AMOUNT"],
**self.kwargs
)
return render(
request, 'form.html', {'form': form}
)
else:
form = self.form_class(**self.kwargs)
return render(
request, 'form.html', {'form': form}
)
return super(OrderCreateView, self).post(request, *args, **kwargs)
它"工作"。我得到一个数量的新表格。但是,当我尝试提交此表单时,我收到错误
null value in column "quantity" violates not-null constraint
答案 0 :(得分:1)
在您的模型中尝试更改
quantity = models.IntegerField(max_digits=10, decimal_places=4)
到
quantity = models.IntegerField(max_digits=10, decimal_places=4, null=True, blank=True)
每当您没有“AMOUNT”标志时,它会尝试创建一个订单而不填写该字段。
更新: 在表单中试试这个
fields = [
'order_type', 'product', 'quantity'
]
widgets = {
'order_type': Select(attrs={'class': 'form-control'}),
'product': Select(attrs={'class': 'form-control'}),
'quantity': NumberInput(attrs={'class': 'form-control'}),
}
def __init__(self, types=[],*args, **kwargs):
super(OrderForm, self).__init__(*args, **kwargs)
if "AMOUNT" not in types:
del self.fields['quantity']
在您的视图中,将super()
放在@neverwalkaloner之前
答案 1 :(得分:1)
您的帖子方法的最后一行无法访问。发布功能永远不会在这里:
return super(OrderCreateView, self).post(request, *args, **kwargs)
我想你需要改变代码的逻辑。例如,如果可能而不是使用POST发送'DATA',请尝试使用GET发送它。或创建另一个视图以使用“AMOUNT”字段呈现表单。
<强>更新强>
另请注意super().post()
调用get_form(),它返回form_class的默认实例。考虑到这个super().post()
可能不是你真正需要的。尝试手动执行表单验证和表单保存:
form = self.form_class(
types=["AMOUNT"],
**self.kwargs
)
if form.is_valid():
instance = self.form.save()
return super().get()