Django:在一个视图中管理多种表单

问题描述:

我试图在一个视图中处理三种形式。我解释: 这是一个结帐表格,其中有一个表单用于发送地址,帐单地址,信用卡信息。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

您还没有初始化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