2012-08-10 67 views
0

我有简单的女巫有交付选项;皮卡并张贴它。还有可能使用折扣优惠券。使用优惠券时,用户将始终必须亲自使用优惠券付款。Django ChoiseField验证

我的问题是,试图在形式上干净使用coupongs时强制此行为,并改变无线电选择,当它将改变form.cleaned_data但鉴于将呈现形式与初始选择。

#forms.py 
class DeliveryOptionsForm(forms.Form): 
    RADIO_CHOICES = (
     ('pickup',"Pick your stuff from office")), 
     ('postit', "send to me by mail (+2€)"), 
    ) 

    delivery = forms.ChoiceField(widget=forms.RadioSelect, 
          choices=RADIO_CHOICES, 
          help_text=_('Select shipping method')) 
    discount = forms.DecimalField(help_text=_('DISCOUNT TICKET'), required=False) 

    def clean(self): 
     data = self.cleaned_data 

     if 'discount' in data:    
      if data['discount'] == None: 
       data['discount'] = 0; 
      else: 
       #force pickup when putting discount coupongs 
       data['pickup'] = 'pickup' 
     return data 

而且我认为

def purchase_confirmation(req): 
    cart = req.session['cart'] 
    form = DeliveryOptionsForm(req.POST or None, initial={'pickup': 'postit'})   

    if req.method == 'POST' and form.is_valid():   
     discount = form.cleaned_data['discount'] 
     pickup = form.cleaned_data['pickup'] 
     # pickup will be correctly set, for logic, 
     # but form will render selection unchanged 
     #Some logic here 
     .... 
     if 'confirm' in req.POST: 
      return redirect('shop-generating_bill') 

     if 'update' in req.POST: 
      pass 

    return render(req,"confirmation.html",{'form' : form}) 

回答

0

不知道这是你的问题的原因,但是,在你的清洁方法,你应该调用父类的方法清洁得到清理的数据。

cleaned_data = super(DeliveryOptionsForm, self).clean() 
+0

我试过这个,但是这个没有效果..谢谢你仍然指出这一点。 – Troyhy 2012-08-11 14:42:12