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 '在转让前提及
有什么建议吗?
预先感谢您!
您还没有初始化form_billing
时是有效的,form_adress.same_adress
是假的,order_number
为0
你引用它在上下文render()
。
而且,看起来是这样的,如果
if not form_adress.same_adress:
应该
if form_adress.same_adress:
是的,但我想要只有在检查到same_adress时才初始化另一个问题是它没有通过form_adress.is_valid()我有一些错误 – Pythdav 2013-04-25 09:51:09
@Pythdav,当form_address无效时form_billing地址也不是初始化,也许你可以初始化一个空的表单,当'same_adress'被选中并将其传递给模板时。 – Rohan 2013-04-25 10:06:43
我像你说的那样做了,我已经传递了表单缺失的问题,但现在他没有认出价值放在字段中,并返回错误,就像没有填充表单一样e字段有价值(第一个)(谢谢:)) – Pythdav 2013-04-25 10:40:50
我did'nt指定的网页试图将POST请求,这就是为什么我的形式是不是在因为初始化如果request.method =='POST',则进入页面的渲染。我试着解决这个问题:if request.method =='POST'而不是request.POST ['submit'] =='Checkout'(这是上一页的POST VALUE – Pythdav 2013-04-25 09:54:48
我试过这个如果请求.method =='POST'和request.POST ['submit'] ==无:并且呈现效果很好,但我无法通过其他验证,因为他没有找到提交的密钥。 – Pythdav 2013-04-25 09:57:55