CBV中的formset验证

时间:2017-06-24 15:42:43

标签: python django

我有一个Order表单,我使用了formset,因为我希望用户动态添加更多产品及其数量。 用户输入订单的名称,并验证它是否为空。 如何验证formset本身?检查产品/数量是否为空

views.py

class OrderCreateView(CreateView):
    model = Order
    template_name = "orderform.html"
    fields = ['name', ]  
    def get_context_data(self, **kwargs):
        data = super(OrderCreateView, self).get_context_data(**kwargs)
        if self.request.POST:
            data['productmetas'] = InlineOrderFormSet(self.request.POST)
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        productmetas = context['productmetas']
        self.object = form.save(commit=False)
        self.object.save()
        if productmetas.is_valid():
            productmetas.instance = self.object
            productmetas.save()

    return super(OrderCreateView, self).form_valid(form)

models.py

class ProductMeta(models.Model):
    order = models.ForeignKey(Order)
    product = models.ForeignKey(Product)
    quantity = models.FloatField()

forms.py

InlineOrderFormSet = inlineformset_factory(Order, ProductMeta,
                                            form=OrderAutoCompleteForm,
                                            extra=1)

1 个答案:

答案 0 :(得分:1)

对于对上述问题的工作解决方案感兴趣的任何人 改编自@neverwalkaloner的答案

def form_valid(self, form):
    context = self.get_context_data()
    productmetas = context['productmetas']
    with transaction.atomic():
        self.object = form.save()
    if form.is_valid():
        if productmetas.is_valid():
            productmetas.instance = self.object
            productmetas.save()
        else:
            return super(OrderCreateView, self).form_invalid(form)

    return super(OrderCreateView, self).form_valid(form)