2013-04-25 56 views
0

我試圖在一個視圖中處理三種形式。我解釋: 這是一個結帳表格,其中有一個表單用於發送地址,帳單地址,信用卡信息。Django:在一個視圖中管理多種表單

我的問題是我想讓用戶選擇是否計費地址與運送地址相同。我用一個複選框做了這個。

但現在我因爲三種形式而停留在驗證中。我不知道如何處理它們。

這裏是我的代碼:

def show_checkout(request, template_name='checkout/checkout.html'): 
user = User.objects.filter(pk=request.user.id) 
if request.method == 'POST': 
    form = CheckoutForm(request.POST) 
    form_adress = ShippingForm(request.POST) 
    if form.is_valid() and form_adress.is_valid(): 
     response = process(request) 
     form_adress.save(commit=False) 

     if not form_adress.same_adress: 
      form_adress.user_shipping = user 
      form_adress.user_billing = user 
     else: 
      form_adress.user_shipping = user 
      form_billing = BillingForm(request.POST) 
      form_billing.save(commit=False) 
      form_billing.user_billing = user 
      form_billing.save() 
     form_adress.save() 
     order_number = response.get('order_number', 0) 
     error_message = response.get('message', '') 
     if order_number: 
      request.session['order_number'] = order_number 
      receipt_url = urlresolvers.reverse('checkout_receipt') 
      return HttpResponseRedirect(receipt_url) 
    else: 
     error_message = 'Correct the errors below' 
else: 
    form = CheckoutForm() 
    form_adress = ShippingForm() 
    form_billing = BillingForm() 
    error_message = None 
if cart.is_empty(request): 
    cart_url = urlresolvers.reverse('show_cart') 
    return HttpResponseRedirect(cart_url) 
page_title = 'Checkout' 
return render(request, template_name, { 
    'error_message': error_message, 
    'page_title': page_title, 
    'form': form, 
    'form_adress': form_adress, 
    'form_billing': form_billing, 
    }, 
context_instance=RequestContext(request)) 

而且我的模板:

<form action="." method="post" class="row-fluid"> 
{% csrf_token %} 
<div class="adress span10"> 
<fieldset class="checkout" style="float:left;"> 
<legend>Shipping Info</legend> 
{{ form_adress.as_p }} 
</fieldset> 
<fieldset class="checkout billing_adress" style="float:left;"> 
<legend>Billing Info</legend> 
{{ form_billing.as_p }} 
</fieldset> 
</div> 
<fieldset class="checkout row-fluid"> 
<legend>Credit Card Info</legend> 
<table> 
{% form_table_row form.name %} 
{% form_table_row form.lastname %} 
{% form_table_row form.credit_card_number %} 
{% form_table_row form.credit_card_type %} 
{% form_table_row form.credit_card_expire_month %} 
{% form_table_row form.credit_card_expire_year %} 
{% form_table_row form.credit_card_cvv %} 
</table> 
</fieldset> 
<table> 
<tr> 
<th colspan="2"><input type="submit" value="Place Order" class="submit" /></th> 
</tr> 
</table> 
</form> 

和我的形式:

class ShippingForm(forms.ModelForm): 
    same_adress = forms.BooleanField(required=True, label="different address for billing ?") 

class Meta: 
    model = Address 
    exclude = 'user_billing, user_shipping' 


class BillingForm(forms.ModelForm): 

    class Meta: 
     model = Address 
     exclude = 'user_billing, user_shipping' 

就目前我所面對的局部變量「form_billing '在轉讓前提及

有什麼建議嗎?

預先感謝您!

+0

我did'nt指定的網頁試圖將POST請求,這就是爲什麼我的形式是不是在因爲初始化如果request.method =='POST',則進入頁面的渲染。我試着解決這個問題:if request.method =='POST'而不是request.POST ['submit'] =='Checkout'(這是上一頁的POST VALUE – Pythdav 2013-04-25 09:54:48

+0

我試過這個如果請求.method =='POST'和request.POST ['submit'] ==無:並且呈現效果很好,但我無法通過其他驗證,因爲他沒有找到提交的密鑰。 – Pythdav 2013-04-25 09:57:55

回答

1

您還沒有初始化form_billing時​​是有效的,form_adress.same_adress是假的,order_number爲0

你引用它在上下文render()

而且,看起來是這樣的,如果

if not form_adress.same_adress: 

應該

if form_adress.same_adress: 
+0

是的,但我想要只有在檢查到same_adress時才初始化另一個問題是它沒有通過form_adress.is_valid()我有一些錯誤 – Pythdav 2013-04-25 09:51:09

+0

@Pythdav,當form_address無效時form_billing地址也不是初始化,也許你可以初始化一個空的表單,當'same_adress'被選中並將其傳遞給模板時。 – Rohan 2013-04-25 10:06:43

+0

我像你說的那樣做了,我已經傳遞了表單缺失的問題,但現在他沒有認出價值放在字段中,並返回錯誤,就像沒有填充表單一樣e字段有價值(第一個)(謝謝:)) – Pythdav 2013-04-25 10:40:50