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