django-clean动力场
我有一个模型:django-clean动力场,django,django-forms,Django,Django Forms,我有一个模型: 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:
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
I中覆盖帖子。在前端,无论是否发送带有数据的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
在你的模型中尝试改变
quantity = models.IntegerField(max_digits=10, decimal_places=4)
到
当您没有“金额”标志时,它会尝试创建订单而不填充该字段
更新:
在你的表格里试试这个
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()
放在前面,因为@neverballener在您的模型中提到了尝试更改
quantity = models.IntegerField(max_digits=10, decimal_places=4)
到
当您没有“金额”标志时,它会尝试创建订单而不填充该字段
更新:
在你的表格里试试这个
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()
放在前面,因为@neverballener提到的您的post方法的最后一行是不可访问的。Post功能永远不会出现在这里:
return super(OrderCreateView, self).post(request, *args, **kwargs)
我想您需要更改代码的逻辑。例如,如果可能,请尝试使用GET发送数据,而不是使用POST发送“数据”。或者创建另一个视图以使用“金额”字段呈现表单
更新
另外请注意,super().post()
调用返回form_类的默认实例。考虑到这一点,super().post()
可能不是您真正需要的。尝试手动执行表单验证和表单保存:
form = self.form_class(
types=["AMOUNT"],
**self.kwargs
)
if form.is_valid():
instance = self.form.save()
return super().get()
post方法的最后一行无法访问。Post功能永远不会出现在这里:
return super(OrderCreateView, self).post(request, *args, **kwargs)
我想您需要更改代码的逻辑。例如,如果可能,请尝试使用GET发送数据,而不是使用POST发送“数据”。或者创建另一个视图以使用“金额”字段呈现表单
更新
另外请注意,super().post()
调用返回form_类的默认实例。考虑到这一点,super().post()
可能不是您真正需要的。尝试手动执行表单验证和表单保存:
form = self.form_class(
types=["AMOUNT"],
**self.kwargs
)
if form.is_valid():
instance = self.form.save()
return super().get()
现在我在clean方法中没有数量。现在我在clean方法中没有数量。谢谢重播。我将def post更改为def get,并且在post方法中仅添加print request.post和return super。当我提交表格时。我可以在打印请求帖子中看到quantity字段,但它在createview中的form\u valid方法(print form.cleaned\u data)中消失了。好的,我刚刚重载了get\u form方法。我不知道这是否是“正确的方式”,但它是有效的。谢谢:)谢谢重播。我将def post更改为def get,并且在post方法中仅添加print request.post和return super。当我提交表格时。我可以在打印请求帖子中看到quantity字段,但它在createview中的form\u valid方法(print form.cleaned\u data)中消失了。好的,我刚刚重载了get\u form方法。我不知道这是否是“正确的方式”,但它是有效的。谢谢:)