gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:06 25 4
gpt4 key购买 nike

我正在尝试制作一个简单的表格,一旦填写,将指向不同的网页,或者如果无效则保留在同一页面上。该页面应该有一个文本框和提交表单,一旦用户输入任何内容,它应该将您引导到一个单独的页面。

我的目录结构如下:

appName/
app/
forms.py
urls.py
views.py
templates/
app/
goodbye.html
name.html
library.html
thanks.html
appName/
settings.py
urls.py

我的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'),
]

我的 forms.py 是:

从 django 导入表单

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

我的 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))

我的模板包括:

name.html :

<form action = "/getname/" method = "post">
{% csrf_token %}
{{ form }}
<input type = "submit" value = "Submit" />
</form>

再见.html

<h1>Goodbye to Template Romance</h1>

<a href="{% url 'app:index' %}">Go Back</a>

thanks.html

Thanks {{name}}!

喜欢的是:

  1. 访问 website.com/getname/以显示 name.html 文件(它确实如此)的用户

  2. 如果用户点击提交以停留在同一页面 (website.com/getname/)(它没有 - 它给出:ValueError at/getname/->The view app.views.get_name didn不会返回 HttpResponse 对象。它返回 None。

  3. 如果用户在提交字段中输入,将被重定向到 website.com/thanks/(确实如此。它当前加载 thanks.html 模板,但 URL 保留在 website.com/获取名称/)

在 get_name(request): 函数中,POST 和 GET if...else 似乎没有根据提交按钮触发,而且它似乎没有加载正确的页面,或者更改处理后的当前 URL 地址。我试过使用 HttpRedirect() ,但是我也想传递表单数据(这是另一个问题)。

任何建议都会有很大帮助!

最佳答案

您的第一个问题是,当请求方法为 post 并且表单无效时,您没有返回响应。您可以通过更改 View 的缩进来解决此问题,以便您始终在 View 结束时返回响应。

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))

如果你想重定向到 /thanks/查看,然后您可以使用重定向快捷方式。

    if form.is_valid():
return redirect('thanks')

请注意,无法重定向和传递表单数据(有关解释,请参阅 this question)。您应该在 重定向之前对数据进行任何处理。你可以使用 messages framework创建消息 'Thanks <name>'在重定向之前。

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

您可以使用 render 来简化您的 View 捷径。而不是

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

你可以简单地做:

return render(request, "app/name.html", context)

记得为快捷方式添加导入:

from django.shortcuts import redirect, render

关于python - DJANGO - 使用数据从 POST 重定向到不同的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36578239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com