【问题标题】:django not returning appropriate responsedjango 没有返回适当的响应
【发布时间】:2015-09-03 11:30:37
【问题描述】:

我有一个带有复选框和按钮的模板。我想要,当我选择所有复选框并按下按钮时,它应该返回值并将其显示为 httpresponse。

索引.html:

<form method="POST" action="/test/">
    {% csrf_token %}
    <div id="row-1">
        <button name="pack" id="pack">Pack</button>
    </div>
    <div id="row-2">
        <table>
            <thead>
                <tr>
                    <th><input type="checkbox" onClick="toggle(this, 'no')"></th>
                    <th>Order Id</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><input type="checkbox" name="no" value="10000001">10000001</td>
                </tr>
                <tr>
                    <td><input type="checkbox" name="no" value="10000002">10000002</td>
                </tr>
            </tbody>
        </table>
    </div>
</form>

views.py:

from django.shortcuts import render, render_to_response
from django.http import HttpResponse
from test1 import forms

def index(request):
    return render(request, 'index.html')

def pack(request):
    oid_list = []
    form = forms.PackOrders(request.POST or None)
    if request.method == 'POST':
        for item in form.cleaned_data['no']:
            oid_list.append(item)
    return HttpResponse(','.join(oid_list))

urls.py:

from django.conf.urls import patterns
from django.conf.urls import url
from test1 import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^test/', views.pack, name='pack'),)

forms.py:

from django import forms

class PackOrders(forms.Form):
    order_items = forms.CharField()

问题是当我点击复选框并返回代码时,它只是重新加载 index.html 而不是显示复选框的值。

预期输出:

10000001,10000002

代码有什么问题?

编辑:

项目 urls.py:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', include('test1.urls')),
    url(r'^test/', include('test1.urls')),
]

【问题讨论】:

  • 如果您在浏览器中访问/test/,会得到一个逗号(,)吗?
  • 不,它只是重新显示索引,html 即使我去localhost:8000/test
  • 嗯。它应该显示一个错误(您的 url 模式中有斜杠,但在您的示例中没有)。您确定您使用的是您发布的 urlpatterns 吗?自从您上次更改 urlpatterns 后,您是否重新启动了 Django?
  • @ManishGupta - 必须是 {% url 'pack' %}
  • 是的,但是 root URL conf 是什么?看来您实际上并没有正确包含此文件。 (是的,Sayse 是对的,应该是“打包”,而不是“测试”。)

标签: python django


【解决方案1】:

您已将您的应用程序 urlconf 包含到您的根 urlconf 中两次。你应该只做一次。但是,您应该从包含它的 URL 中删除 $:

url(r'^', include('test1.urls')),

如果您使用带有“test/”前缀的第二个版本,您将在“/test/”和“/test/test/”处创建 URL,这可能不是您想要的。

请注意,正如我在评论中所说,您应该始终通过名称引用 URL,而不是直接引用。所以你的表单操作应该是"{% url 'pack' %}"

【讨论】:

  • 现在它正在抛出'PackOrders' object has no attribute 'cleaned_data'。我知道它必须与views.py。在关于 SO 的几篇文章中,他们使用此属性来获取表单数据。那么为什么它会抛出错误?我是否以错误的方式使用它?
  • @ManishGupta - 可能是因为表单无效(与form.is_valid() 核对),这不是因为您没有为 order_items 提供值而我没有知道复选框在该表单中的相关性。但这是一个完全不同的问题,超出了您所问的范围。
  • 我已经为 html 中的复选框提供了值。而is_valid() 则抛出 False。这也是一个测试项目,真实项目包括要作为参数传递给 python 脚本的数据。那么我该如何纠正这个值。我只想在 html 页面中打印复选框的值。
  • 您应该就此提出一个新问题。但是您似乎没有任何理由在这里使用表单,而不仅仅是访问 request.POST。
【解决方案2】:
正则表达式中的

$ 表示字符串的结尾,因此您的 include 永远不会有机会匹配其任何 url(我想这就是您的其他 urls.py 的内容)。因此,您需要将您的网址更改为包含的网址

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^/', include('test1.urls')),
    url(r'^test/', include('test1.urls')),
]

请注意,我已更改第二个以删除 $ 并用斜杠替换它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多