我正在写一个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
答案 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
。