2017-06-24 8 views
0

私はフォームセットを使用するオーダーフォームを使用しています。これはユーザーに、より多くの製品とその数量を動的に追加させたいからです。 ユーザーが注文の名前を入力し、それが空でないことが検証されます。 フォームセット自体を検証するにはどうすればよいですか?製品/数量が空でないことを確認しCBVの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

これを確認してくださいhttps://gist.github.com/neara/6209563 – neverwalkaloner

+0

ありがとうございます、それはうまくいきます。私が変更しなければならなかったのは 'commit_on_success'を' atomic'に置き換えることでした。 'commit_on_success'はもはや' transaction'の一部ではありません(django 1.11使用時)。私はformsetにdjango-autocomplete-lightを使用しており、htmlに検証エラーを表示させるためには無効にする必要がありました。私はそれをdjango-autocomplete-lightと一緒にすることができますか? – ChenR

答えて

0

上記の質問の解答 @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)