【发布时间】:2014-04-27 22:12:22
【问题描述】:
这很奇怪。用了 Django 表单很久了,一直搞不懂。
我有一个带有 1 个“数量”字段的小表格。每当我提交表单时,什么都没有发生,并且它永远不会进入我的状态来检查请求方法是否是 POST。我也在代码中放了一个 pdb,但它永远不会到达。我不确定为什么。这是代码。
views.py
>def show_product(request, product_slug, template_name='catalog/product.html'):
product_cache_key = request.path
product = cache.get(product_cache_key)
if not product:
product = get_object_or_404(Product, slug=product_slug)
cache.set(product_cache_key, product, settings.CACHE_TIMEOUT)
categories = product.categories.filter(is_active=True)
if request.method == 'POST':
import pdb; pdb.set_trace() # it NEVER hit's this
postdata = request.POST.copy()
form = ProductAddToCartForm(request, postdata)
if form.is_valid():
cart.add_to_cart(request)
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
url = urlresolvers.reverse('show_cart')
return redirect(url)
else:
form = ProductAddToCartForm(request=request)
form.fields['product_slug'].widget.attrs['value'] = product_slug
request.session.set_test_cookie()
context = RequestContext(request, locals())
return render_to_response(template_name, context)
forms.py
>class ProductAddToCartForm(forms.Form):
quantity = forms.IntegerField(widget=forms.TextInput(attrs={'class': 'input-quantity', 'placeholder': 'Qty'}), error_messages={'invalid': 'Please enter a valid quantity.'}, min_value=1)
product_slug = forms.CharField(widget=forms.HiddenInput())
def __init__(self, request=None, *args, **kwargs):
self.request = request
super(ProductAddToCartForm, self).__init__(*args, **kwargs)
def clean(self):
if self.request:
if not self.request.session.test_cookie_worked():
raise forms.ValidationError("Sorry, please enable your cookies.")
return self.cleaned_data
模板
<form method="post" action=".">
{% csrf_token %}
{{ form.quantity.errors }}
{{ form.quantity }}
<input type="submit" name="submit" value="Add to Cart" class="btn btn-danger" />
{{ form.product_slug }}
</form>
当我点击“添加到购物车”时,URL 会从 http://localhost:8000/product/arm-glove/ 转到这个 http://localhost:8000/product/arm-glove/?csrfmiddlewaretoken=RFG0F1Lg0Eu3GcDhtYwPPCpy9Oct5zCX&quantity=2&submit=Add+to+Cart&product_slug=arm-glove
我在这里错过了什么?
【问题讨论】:
-
请求是否到达视图函数?它总是对 GETs 吗?开发工具说表单在做什么?
-
它进入函数,表单呈现,所以这个
form = ProductAddToCartForm(request=request)正在工作 -
好的,如果你记录 request.method 它 == 'GET'?开发工具说表单在客户端发送什么?
-
它肯定会是一个 GET,因为表单正在呈现而不是 POST,我试过了,并且怀疑 pdb 进入(pdb)控制台......我刚刚发现了一些东西......一个未关闭的上面的表单标记只是用于搜索的 GET。
-
酷,很高兴你明白了。
标签: django django-forms django-templates django-views