【问题标题】:Django form does not appearDjango 表单不出现
【发布时间】:2014-02-18 22:05:09
【问题描述】:

我正在使用 Django 的 Form 类构建一个带有表单的网页。我已经包含了一些示例代码 sn-ps 但我的问题是我遵循了 Django 文档和 Djangobook 中的教程,但无法让我的表单实际显示在页面上。

forms.py

from django import forms

class ResearchForm(forms.Form):
    fam_choices = ...
    spec_choices = ...
    family = forms.ChoiceField(choices=fam_choices, required=True)
    species = forms.ChoiceField(choices=spec_choices, required=True)

views.py

from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render
from mysite.forms import ResearchForm

...

def research(request):
    if request.method == 'GET': 
        form = ResearchForm(request.GET)
        if form.is_valid():
            f = form.cleaned_data['family']
            s = form.cleaned_data['species']
            return render(request, 'thankyou.html', {})
    else: 
         form = ResearchForm() # an unbound form
    return render(request, "research.html", {'form':form})

research.html

...
<form action="/research/" method="get" name="researchform">
   {{ form.as_p}}
   <button>Submit</button>
</form>
...

网页上仅显示按钮,ChoiceField 应呈现的 select 标记不显示。

编辑:

我将views.py 编辑为:

def research(request):
    form = ResearchForm(request.GET)
    if form.is_valid():
        return render(request, 'thankyou.html', {})
    else: 
        form = ResearchForm()
        return render(request, 'research.html', {'form':form})

编辑 2:

urls.py

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('cms.urls')),
)

if settings.DEBUG:
    urlpatterns = patterns('',
        (r'^' + settings.MEDIA_URL.lstrip('/'), include('appmedia.urls')),
    ) + urlpatterns

【问题讨论】:

    标签: django forms django-forms django-cms


    【解决方案1】:

    你不应该检查方法,而只检查表格的有效性。比如:

    def research(request):
        form = ResearchForm(request.GET)
        if form.is_valid():
            f = form.cleaned_data['family']
            s = form.cleaned_data['species']
            return render(request, 'thankyou.html', {})
        else: 
            form = ResearchForm() # an unbound form
            return render(request, "research.html", {'form':form})
    

    这样,如果 GET 请求包含有效的表单数据,则显示感谢页面,如果不是,则呈现表单。

    【讨论】:

    • 感谢您的回复。我试过了,但到目前为止还没有。奇怪的事情正在发生。在我的research.html 页面上,没有显示任何表单。然后,当我单击提交按钮时,它似乎没有调用views.py 中的research 函数,而是试图访问不存在的/research 网页。我的 HTML 有问题吗?
    • 在您的 HTML 中,您最好使用 URL tag 而不是 /research,因为这正是您将表单指向的位置。 (更新:你也可以发布你的urls.py吗?)
    • @LaundroMat,我用urls.py 更新了我的问题。我还在form 标记的action 属性中添加了:{% url "mysite.views.research %},现在我收到 NoReverseMatch 错误。
    • 那是因为没有为研究视图配置 url。您应该添加url(r'^research/', research, name="research")from mysite.views import research
    • @LaundroMat:感谢您的回复。是的,这确实有效,但我想知道这是否是“犹太洁食”。因为我有一个 CMS,我应该只是将页面添加到 urls.py 还是在 CMS 管理员中创建它们?
    【解决方案2】:

    当你第一次渲染页面时,第一个条件将被调用:

    if request.method == 'GET':
    

    并且由于表单无效,它永远不会在任何地方传递,因此form 变量为空。

    两个地方都应该有POST,而不是GET

    if request.method == 'POST': 
        form = ResearchForm(request.POST)
    

    【讨论】:

    • 感谢您的回复。我把我的代码改成了POST,就像你描述的那样。表单标签的属性仍然是GET。然后,我重新启动了 Apache 并刷新了页面,但仍然没有显示任何表单。还有其他建议吗?
    • 是的,我也试过了,但也没有用。有没有办法用 Django 表单做 GET 请求?因为它是一个 POST 请求,所以我添加了{% csrf_token %},这对我来说很好。我可以单击提交按钮并获得相应的页面......事实上,表单本身甚至没有显示,这让我感到困扰。
    • @noblerare 表单应该显示任何一种情况,您是否尝试过 django-debug-toolbar,查看模板上下文中是否存在表单对象?很难说哪里出了问题,因为我建议的代码应该可以工作。您是否尝试过仅渲染未绑定的表单(没有条件)?可能是 Apache 的问题,尝试使用开发服务器运行项目..
    • 无论form标签的action属性是否设置,都应该显示表单,对吧?我现在有:&lt;form action="" method="POST"&gt;,但仍然没有显示任何表单。但是现在,我有点困惑,如果views.py中的research函数只在我单击按钮时被调用,那么Django如何知道在不设置上下文变量的情况下将哪些数据放入{{ form.as_p }}占位符?跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2011-03-02
    • 2019-04-25
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多