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方法。我不知道这是否是“正确的方式”,但它是有效的。谢谢:)