2011-03-25 4 views
1

나는 modelformset와 일하고 있으며 조금 붙어 있습니다. 나는 통과하고있다, modelformsetfactory를 사용하여 20의 모양을 말한다. 이 양식은 구성되어 페이지에 표시됩니다. 게시 후 돌아 오면 모델 필드의 가치에 따라 이러한 형식 중 일부만 유효성을 검사하고 저장해야합니다.Django modelformset 유효성 검사 문제 : 요청에 queryset을 사용하는 방법 .POST?

나는 request.POST에서 queryset을 사용하여 유효성을 검사 할 내 formset에서 원하는 양식을 제한 할 수 있다고 생각했습니다. 그러나 이것은 효과가 없습니다. 양식의 수를 제한 할 수있는 방법이 있습니까? 모델 인스턴스를 제한하는 검색어 세트에 대한

나는

formset = PaymentOptionFormSet(request.POST, queryset=payment_option_posted_queryset) 

나는 다음과 같은 오류가

을 시도 :

IndexError at /seller/seller_profile/ 

list index out of range 


Traceback: 
File "/home/shagun/work/tinla/django/core/handlers/base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "/home/shagun/work/tinla/web/views/user_views.py" in seller_profile 
    164.    formset = PaymentOptionFormSet(request.POST, queryset=payment_option_posted_queryset)   
File "/home/shagun/work/tinla/orders/forms.py" in __init__ 
    400.   super(BasePaymentOptionFormSet, self).__init__(*args,**kwargs) 
File "/home/shagun/work/tinla/django/forms/models.py" in __init__ 
    423.   super(BaseModelFormSet, self).__init__(**defaults) 
File "/home/shagun/work/tinla/django/forms/formsets.py" in __init__ 
    47.   self._construct_forms() 
File "/home/shagun/work/tinla/django/forms/formsets.py" in _construct_forms 
    97.    self.forms.append(self._construct_form(i)) 
File "/home/shagun/work/tinla/django/forms/models.py" in _construct_form 
    447.    kwargs['instance'] = self.get_queryset()[i] 
File "/home/shagun/work/tinla/django/db/models/query.py" in __getitem__ 
    172.    return self._result_cache[k] 

Exception Type: IndexError at /seller/seller_profile/ 
Exception Value: list index out of range 

내 코드는 다음과 같습니다

def seller_profile(request): 
    from accounts.models import PaymentOption, PaymentMode 
    payment_options = PaymentOption.objects.select_related('payment_mode').filter(payment_mode__client__id=1) 
    payment_option_queryset = PaymentOption.objects.filter(payment_mode__client__id='1') 
    payment_option_posted_queryset = PaymentOption.objects.filter(payment_mode__client__id='1', is_active='1') 

    if request.user.is_authenticated(): 

     PaymentOptionFormSet = modelformset_factory(PaymentOption, formset = BasePaymentOptionFormSet, extra=0, fields = ("payment_delivery_address", "bank_branch", "bank_ac_name", "bank_ac_type", "bank_ac_no", "bank_address", "bank_ifsc", "is_active")) 
     user = request.user.get_profile() 
     if request.method == "POST":#If the form has been submitted 
      form1 = SellerProfileForm(request.POST, instance = user) 
      form2 = SellerNotificationForm(request.POST, instance = user) 
      formset = PaymentOptionFormSet(request.POST, queryset=PaymentOption.objects.all()) 

      counting = 0 
      for form in formset.forms: 
       counting +=1 
      print "count = ",counting 
      print formset.is_valid() 
      if form1.is_valid() and form2.is_valid: 
       form1.save() 
       form2.save() 
      else: 
       my_acct_ctxt = getMyAccountContext(request) 
       return render_to_response('seller/seller_profile.html', 
       { 
        'form1': form1, 
        'form2': form2, 
        'formset': formset, 
        'error1': form1.errors, 
        'error2': form2.errors, 
        'errorformset': formset.errors, 
        'payment_options': payment_options, 
        'acc': my_acct_ctxt, 
       }, 
       context_instance=RequestContext(request)) 

     else: #If the form has not been submitted 
      form1 = SellerProfileForm(instance = user) 
      form2 = SellerNotificationForm(instance = user) 
      formset = PaymentOptionFormSet(queryset=payment_option_queryset) 
      counter = 0 

     my_acct_ctxt = getMyAccountContext(request) 
    return render_to_response('seller/seller_profile.html', 
     { 
     'form1': form1, 
     'form2': form2, 
     'formset': formset, 
     'payment_options': payment_options, 
     'acc':my_acct_ctxt, 
     }, 
     context_instance=RequestContext(request)) 

답변

0

당신이 경우 조건부로 formset의 유효성을 검사해야하는 경우 formset의 clean 메서드를 재정의 할 수 있습니다. 다음은 인라인 formset의 admin 내에서이 작업을 수행 한 예입니다. Formset 클래스가 꽤 균질하므로 필요에 맞게 변경할 수 있습니다.

class MyInlineFormset(forms.models.BaseInlineFormSet): 
    def clean(self): 
     for form in self.forms: 
      try: 
       if form.cleaned_data: 
        delete = form.cleaned_data.get('DELETE') 
        if not delete: 
         my_field = form.cleaned_data.get('my_field', None) 
         if my_field: 
          if my_field == 'some_value': 
           #only validate the other values 
           #if the field you're looking for 
           #has a particular value, etc 
           another_field = form.cleaned_data.get('another_field') 

           #more validation here where you can raise 
           #forms.ValidationError() 

      except AttributeError: 
       pass 

나는 당신을 돕기를 바랍니다.

+0

답장을 보내 주셔서 감사합니다. 내 문제에 대한 해결책을 찾았습니다. POST에서 이제 formset의 선택된 양식 만 유효성을 검사하고 전체 formset의 유효성을 검사하지 않습니다. 양식 오류에 대한 사전을 만들고 formset.errors를 전달하는 대신 서식 파일로 다시 전달합니다. 그것은 getaround 방법이지만 작동합니다. 웬일인지, 깨끗한 방법은 효과가없는 것처럼 보였다. 어쨌든, 답장을 보내 주셔서 감사 드리며 새로운 것을 배웠습니다. – user676122

+0

대단히 반갑습니다. 나는 당신이 생각해 본 해결책의 예를보고 싶다. 건배 – Brandon