django - 清洁动态领域

时间:2016-12-15 13:54:35

标签: 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:
        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

2 个答案:

答案 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()