DJANGO - 使用数据从POST重定向到不同的页面

Jee*_*ves 3 python django post redirect request

我想要一个简单的表单,一旦填充,将指向不同的网页或如果无效则保持在同一页面上.页面应该有一个文本框并提交表单,一旦用户输入任何内容,它应该指向一个单独的页面.

我的目录结构如下:

appName/
       app/
          forms.py
          urls.py
          views.py
          templates/
               app/
                 goodbye.html
                 name.html
                 library.html
                 thanks.html
       appName/
           settings.py
           urls.py
Run Code Online (Sandbox Code Playgroud)

我的app/urls.py如下:

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

app_name = 'app'

urlpatterns = [
        url(r'^$', views.index2, name = 'index'),
        url(r'^hello/$', views.hello, name = 'hello'),
        url(r'^goodbye/$', views.goodbye, name = 'goodbye'),
        #url(r'^library$', views.library, name = 'library'),
        url(r'^library/$', views.library, name = 'library'),
        url(r'^library/(?P<book_id>[0-9]+)/$', views.book, name = 'book'),
        url(r'^getname/$', views.get_name, name = 'get_name'),
        url(r'^your-name/$',views.get_name, name='get_name'),
        url(r'^thanks/$',views.say_thanks,name='thanks'),
        #url(r'^thanks/(?P<name_id>[a-zA-Z]+)/$', views.say_thanks,name='thanks'),
        ]
Run Code Online (Sandbox Code Playgroud)

我的forms.py是:

来自django进口表格

class NameForm(forms.Form):
    your_name = forms.CharField(label = 'Your name', max_length=100)
Run Code Online (Sandbox Code Playgroud)

我的app/views.py是:

from django.http import HttpResponse
from django.template import loader
from django.shortcuts import render
from django.http import HttpResponseRedirect

#forms
from .forms import NameForm

# Create your views here.
def index2(request):
    return HttpResponse("hello world")

def hello(request):
    text = """<h1>Welcome to my app! </h1>"""
    return HttpResponse(text)

def goodbye(request):
    template = loader.get_template("app/goodbye.html")
    context = {
        'output' : 'This is output from goodby views.py request handler'
        }

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

def library(request):
    template = loader.get_template("app/library.html")
    context = {
        'output' : 'Welcome to the libary!!'
        }
    return HttpResponse(template.render(context, request))

def book(request, book_id):
    return HttpResponse("You're looking at book %s. " % book_id)

def get_name(request):

    # 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
            locationGo = "/thanks/"
            template = loader.get_template("app/thanks.html")

            return HttpResponse(template.render({'name':'name'},request))
    else:
            form = NameForm()
            template = loader.get_template("app/name.html")
            context = {'form': form}
            return HttpResponse(template.render(context, request))

def say_thanks(request):
    template = loader.get_template("app/thanks.html")
    return HttpResponse(template.render({'name': 'name'},request))
Run Code Online (Sandbox Code Playgroud)

我的模板包括:

name.html:

<form action = "/getname/" method = "post">
    {% csrf_token %}
    {{ form }}
    <input type = "submit" value = "Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

goodbye.html

<h1>Goodbye to Template Romance</h1>

<a href="{% url 'app:index' %}">Go Back</a>
Run Code Online (Sandbox Code Playgroud)

thanks.html

Thanks {{name}}!
Run Code Online (Sandbox Code Playgroud)

我会的是:

  1. 用户访问:website.com/getname/以显示name.html文件(它可以)

  2. 如果用户点击提交以保持在同一页面(website.com/getname/)(它没有 - 它给出:ValueError at/getname/ - >视图app.views.get_name没有返回HttpResponse对象它改为返回None.

  3. 如果用户在提交字段中输入,被重定向到website.com/thanks/(排序它一样.目前,它加载thanks.html模板,但URL停留在website.com/getname/)

在get_name(request):函数内部,POST和GET if ... else似乎没有基于Submit按钮触发,并且它似乎没有加载正确的页面,或者更改当前的URL地址一旦它被处理.我已经尝试使用HttpRedirect(),但是,我也想传递表单数据(这是另一个问题).

任何建议都将是一个很大的帮助!

Ala*_*air 5

您的第一个问题是,当请求方法发布且表单无效时,您没有返回响应.您可以通过更改视图的缩进来解决此问题,以便始终在视图末尾返回响应.

def get_name(request):

    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        ...
    else:
        form = NameForm()
    template = loader.get_template("app/name.html")
    context = {'form': form}
    return HttpResponse(template.render(context, request))
Run Code Online (Sandbox Code Playgroud)

如果要重定向到/thanks/视图,则可以使用重定向快捷方式.

    if form.is_valid():
        return redirect('thanks')
Run Code Online (Sandbox Code Playgroud)

请注意,无法重定向并传递表单数据(有关说明,请参阅此问题).重定向之前,您应该使用数据进行任何处理.您可以使用消息框架'Thanks <name>'在重定向之前创建消息.

这是有效的,因为你有name='thanks'你的网址模式.

您可以使用render快捷方式简化视图.代替

template = loader.get_template("app/name.html")
context = {'form': form}
return HttpResponse(template.render(context, request))
Run Code Online (Sandbox Code Playgroud)

你可以简单地做:

return render(request, "app/name.html", context)
Run Code Online (Sandbox Code Playgroud)

请记住为快捷方式添加导入:

from django.shortcuts import redirect, render
Run Code Online (Sandbox Code Playgroud)