django,将视图直接定向到另一个html页面

时间:2018-10-17 05:20:45

标签: django

我正在使用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)

2 个答案:

答案 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>