【问题标题】:Django: Redirecting to another url based on user input in formDjango:根据表单中的用户输入重定向到另一个 url
【发布时间】:2016-08-25 04:48:55
【问题描述】:

在查看了 Django 表单文档以及 Django 表单教程(第 4 部分)中的部分以及几个 SO 线程后,我正在尝试实现一些非常简单的东西。

我有一个主页,其中有一个表单,用户应该能够在其中输入某个篮球运动员的姓名。当他们点击提交时,它应该重定向到我的另一个页面,即 player_stats 页面,该页面将显示有关该玩家的一些信息。理想情况下,我还希望在 player_stats 页面本身上提供相同的表单,以便用户可以从一个播放器转到另一个播放器,而不必在两者之间返回主页。

我应该添加,所有这些文件都位于“桌面”中的应用程序的名称。

forms.py

from django import forms

class NameForm(forms.Form):
    name = forms.CharField(label='Name', max_length=100)

index.html

<div> HOME PAGE </div>
<form action="{% url 'player_stats' name %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Go"/>
</form>

views.py

def index(request):
template = loader.get_template('desk/index.html')
return HttpResponse(template.render(request))   

def player_stats(request, name):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
    # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # redirect to a new URL:
            name = form.cleaned_data['name']

    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()

    template = loader.get_template('desk/player_stats.html')
    context = get_player_stats_context(tag)

    return HttpResponse(template.render(context, request))

urls.py

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<name>([\s\S]+))/player_stats/$', views.player_stats, name='player_stats'),
]

我猜文档中显示的示例与我的情况略有不同,因为模板似乎总是有一些由视图提供的上下文对象,或者重定向到硬编码的 url,如果表单有效并且 url 就会发生这种情况不取决于提交表单的内容是什么。我在这里没有得到什么?

【问题讨论】:

  • 您正在处理 index 视图中的 post 事件,而您应该在 player_stats 中执行此操作,因为您的表单操作指向该视图。这样你也不需要重定向。

标签: python django forms


【解决方案1】:

您应该使用form.cleaned_data 中给出的名称,而不是form.name。 所以你的代码应该是

return HttpResponseRedirect(reverse('desk:player_stats', 
                       args=(form.cleaned_data['name'],)))

【讨论】:

  • 不幸的是,这似乎只是我遇到的几个问题之一。我根据您的回答和@Selcuk 的评论对我的代码进行了一些编辑,但仍然不满意。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2016-10-12
  • 2020-07-10
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2010-12-05
  • 2023-03-23
相关资源
最近更新 更多