【问题标题】:Django form NEVER postsDjango 表单从不发帖
【发布时间】: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&amp;quantity=2&amp;submit=Add+to+Cart&amp;product_slug=arm-glove

我在这里错过了什么?

【问题讨论】:

  • 请求是否到达视图函数?它总是对 GETs 吗?开发工具说表单在做什么?
  • 它进入函数,表单呈现,所以这个form = ProductAddToCartForm(request=request)正在工作
  • 好的,如果你记录 request.method 它 == 'GET'?开发工具说表单在客户端发送什么?
  • 它肯定会是一个 GET,因为表单正在呈现而不是 POST,我试过了,并且怀疑 pdb 进入(pdb)控制台......我刚刚发现了一些东西......一个未关闭的上面的表单标记只是用于搜索的 GET。
  • 酷,很高兴你明白了。

标签: django django-forms django-templates django-views


【解决方案1】:

原来有一个用于搜索的未闭合标签是一个 GET 请求,因此表单的 POST 从未被看到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多