从主页重定向到不同的视图 - django

时间:2016-07-09 16:16:50

标签: python django django-views

我正在写一个django应用程序,我想做这样的事情:在我的主页上,你可以通过链接找到不同的选项。

这是我的主页..

<title>Homepage</title>

<body>
<li> <a href = "{% url 'options1' %} " > Options1 </a> </li>
<li> <a href = "{% url 'options2' %} " > Options2 </a> </li>
</body>

这是我的网址模式&#34; app / urls.py&#34;:

urlpatterns = patterns('',
url (r'^', view.homepage, name='homepage'),
url (r'^/options1/$', views.options1, name ='options1'),
url (r'^/options2/$', views.options2, name ='options2'),
)

但我无法理解如何编写视图,我使用HttResponseRedirect(或shortcuts),但如何理解用户选择的选项?

这是我的简单视图

def homepage (request):

return render(request, 'homepage.html')

当我运行应用程序时,它会给我一个错误,这是完整的追溯:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/app/

Django Version: 1.8
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'myapp')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Template error:
In template /home/hari/project/NewSite/templates/homepage.html, error at line 8
   argument to reversed() must be a sequence

   1 : <!DOCTYPE html>



   2 : <html lang="en">



   3 : <head>



   4 :     <meta charset="UTF-8">



   5 :     <title>HomePage</title>



   6 : </head>



   7 : <body>



   8 :      <li> <a href=" {% url 'option1' %} ">Option1</a> </li>



   9 :      <li> <a href="{% url 'option2' %}">option2 </a> <li>



   10 : </body>



   11 : </html>

Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/riluin/PycharmProjects/Thesis/mybper/views.py" in Homepage
  11.     return render(request, 'homepage.html')
File "/usr/local/lib/python2.7/dist-packages/django/shortcuts.py" in render
  67.             template_name, context, request=request, using=using)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py" in render_to_string
  99.         return template.render(context, request)
File "/usr/local/lib/python2.7/dist-packages/django/template/backends/django.py" in render
  74.         return self.template.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
  209.                     return self._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
  201.         return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py" in render
  493.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in reverse
  579.     return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in _reverse_with_prefix
  433.             self._populate()
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in _populate
  285.         for pattern in reversed(self.url_patterns):

Exception Type: TypeError at /myapp/
Exception Value: argument to reversed() must be a sequence

2 个答案:

答案 0 :(得分:1)

在每个视图中渲染一个模板并为每个选项创建一个html模板。来自Django tutorial的民意调查应用程序可用作参考示例。

重定向适用于您拥有旧网址并希望链接指向新网址的情况。这不是你想要的。

每个网址都有自己的视图功能,并且通常也有自己的html模板。主页视图应该只处理主页的准备信息。

从urls.py中的模式匹配中获取输入数据。如果你添加

  (P<parameter2>.*)/ 

到option2 url的末尾并将视图更改为

 def option2(request,parameter2)

你会在最后一个/之前获得最后的结果。

您还可以提交HTML表单并使用&#34;请求&#34;的POST字典。变量。如果您的表单包含输入字段x,y,z:

<form id="formxyz" action="{% url "option3" %}" method="post">
    <input type="text" name="x" placeholder="x"/><br/>
    <input type="text" name="y" placeholder="y"/><br/>
    <input type="text" name="z" placeholder="z"/><br/>
    <button type="submit">SUBMIT</button>
{% csrf_token %}</form>

您获取请求对象中的数据:

def option3(request):
    (x,y,z) = (request.POST['x'], request.POST['y'],request.post['z'])
    txt_page = "X multiplied by Y divided by Z is "+ str((x*y)/z)+\
    repr(request.POST)
    return HttpResponse(plain_text_page,content_type="text/plain")

答案 1 :(得分:0)

为此目的,Django提供reverse功能。您可以将url名称传递给它,函数将返回url路径:

from django.core.urlresolvers import reverse

def homepage (request):
    HttpResponseRedirect(reverse('option1'))

此外,您可以在不reverse的情况下对您的网址进行硬编码,只需将/options1/放入HttpResponseRedirect,但最好像您一样使用网址名称。

看看你的代码,你不需要这个关于所选选项的条件,选择的url会自动触发你放入urlpaterns的视图,比如option1会触发views.options1