我正在使用Django开发网站。该网站旨在用于搜索存储在MySQL数据库中的信息。
这是网站的当前基本流程。 1)index.html-它具有选择选项的形式 2)根据选项,用户将重定向到search.html(包括一个表格) 3)一旦用户提供了标准,结果就会显示在reply.html
在我的views.py中,我有两个功能。
from django.shortcuts import render
from website.models import WebsiteRepository
from .forms import SearchForm
from .forms import SelectTypeForm
def Search(request):
if request.method == 'POST':
#do something
return render(request, 'reply.html', {'env_dict':env_dict})
else:
#do something
return render(request, 'search.html', context = context)
def index(request):
if request.method =='POST':
#do something
return render(request, 'search.html', context = context)
else:
#do something
return render(request, 'index.html', context= context)
当我进入index.html页面时,我可以选择一个选项,它将引导我进入search.html。之后,我在那里填写表格并提交,它不会给我reply.html页面。
我有一种感觉,可以通过更改urls.py来完成这项工作。
from django.urls import path
from website import views
urlpatterns = [
path('', views.index, name='index'),
#path('search/', view.Search, name ='Search')
]
我试图用Google搜索它。但是它的细节太多了,我很失落。
你们中有人知道如何实现吗?
谢谢
search.html
{% extends "base_generic.html" %}
{% block content %}
<h3>Welcome to search information Repository</h3>
<form method="post">
{% csrf_token %}
{{form.as_p}}
<button type = 'submit'>submit</button>
</form>
{% endblock %}
index.html
{% block content %}
<h3>Welcome to information Repository</h3>
<form method="post">
{% csrf_token %}
{{form.as_p}}
<button type = 'submit'>submit</button>
</form>
只是为了澄清更多信息,所以我也添加了forms.py
from django import forms
from .models import WebsiteRepository
class SearchForm(forms.Form):
websiterepository = WebsiteRepository
env_indicators = websiterepository.objects.filter (key_aspect='Environmental').values_list('repo_id','indicator')
indicator = forms.ChoiceField(choices=env_indicators,label = 'Indicator' )
OPTIONS = (('2000','2000'),('2001','2001'),('2002','2002'), ('2003','2003'),('0000','0000'),)
year = forms.ChoiceField(choices=OPTIONS)
class SelectTypeForm(forms.Form):
OPTIONS = (('1', 'Envirnmental Indicators'),('2','Economic Indicators'),('3','Social Indicators'),)
types = forms.ChoiceField(choices=OPTIONS)
答案 0 :(得分:0)
您的代码在很多方面是错误的。
第一件事:搜索时,您需要一个GET请求,而不是POST(POST用于更新服务器状态-主要是添加或更新数据库)。这是在语义上正确的方法(因为您要获取数据),它将允许用户为URL添加书签。
第二点:您不想将搜索表单提交给索引视图,而是希望提交给搜索视图。无需重定向等,只需使用{% url %}
templatetag来填充表单的action
属性(您当然需要在urls.py中有一个“搜索” URL):
<form method="get" action="{% url 'Search' %}">
{% csrf_token %}
{{form.as_p}}
<button type = 'submit'>submit</button>
</form>
如果您希望将此表单放在多个页面上(搜索表单通常是这种情况),use an inclusion tag将负责创建未绑定的SearchForm并呈现模板片段。
然后在搜索视图中,您只需要GET请求,并且不使用两个不同的模板,这只会导致无用的重复。
def Search(request):
form = SearchForm(request.GET)
# use the form's data - if any - to get search results
# and put those results (even if empty) in you context
return render(request, 'reply.html', {'env_dict':env_dict})
最后,您的搜索表单已完全损坏:
class SearchForm(forms.Form):
# this is totally useless
websiterepository = WebsiteRepository
# this will only be evaluated once at process startup, so you will
# get stale data in production - and probably different data
# per process, in a totally unpredictable way.
# You need to either put this in the form's __init__ or wrap it
# in a callable and pass this callable
env_indicators = websiterepository.objects.filter (key_aspect='Environmental').values_list('repo_id','indicator')
indicator = forms.ChoiceField(choices=env_indicators,label = 'Indicator' )
# are you going to manually add a new year choice every year ???
OPTIONS = (('2000','2000'),('2001','2001'),('2002','2002'), ('2003','2003'),('0000','0000'),)
year = forms.ChoiceField(choices=OPTIONS)
对于“指标” ChoiceField,您需要以下内容:
def get_indicators_choices():
return Websiterepository.objects.filter (key_aspect='Environmental').values_list('repo_id','indicator')
class SearchForm(forms.Form):
# IMPORTANT : we are NOT calling the function here, just
# passing it (python functions are objects) to the field, which
# will call it everytime the form is instanciated, so you don't
# have stale data
indicator = forms.ChoiceField(
choices=get_indicator_choices,
label='Indicator')
最后一点:请与您的命名保持一致(即为什么在下面的所有视图中命名一个视图(index
),在另一个视图中使用大写字母(Search
)?无论选择哪种约定(我强烈建议{ {3}}),至少在整个项目中都要坚持下去。
答案 1 :(得分:-1)
问题是代码没有重定向到/search
,而是在从 index.html 发布后呈现 search.html 。
尝试做类似的事情
views.py-
#your code
def index(request):
#do something
if request.method == 'POST':
return redirect('Search')
else:
#render index.html
def search(request):
#do something
if request.method == 'POST':
#render reply.html
else:
#render search.html
另一种实现此目的的方法是,如果您在表单中指定 action ,以便表单发布在/search
上。
search.html
<form method="post" action="/search">
{% csrf_token %}
{{form.as_p}}
<button type = 'submit'>submit</button>
</form>