如何让 reverse() 在基于函数的视图中工作
Posted
技术标签:
【中文标题】如何让 reverse() 在基于函数的视图中工作【英文标题】:How do I get reverse() to work in a function based view 【发布时间】:2018-12-20 20:51:26 【问题描述】:我是 Django 新手,我想为不需要模型的活动尝试 FBV。这最终将使用用户定义的参数实现搜索并在模板中显示结果,但现在我的模板和视图基本上是空的以显示此问题。
我正在使用 python 3.6 和 Django 2.1.3。
教程直接指向 CBV,我很难获得有关 FBV 方式的好信息。
File: 'positivepets/picture_search.html':
-------
% extends 'positivepets/base.html' %
% block body %
<p> You have reached the picture search page </p>
% endblock %
File: urls.py
--------
app_name = 'positivepets'
urlpatterns = [...
url(r'^picture_search/$', views.misc_views.picture_search, name='picture_search'),
...]
File: misc_views.py
--------
def picture_search(request):
return render(request, 'positivepets/picture_search.html')
问题
这一切正常并呈现模板picture_search.html
。
我的问题是我想避免对模板名称进行硬编码。我认为这会起作用:
def picture_search(request):
return HttpResponseRedirect(reverse('positivepets:picture_search'))
这会将用户带到http://127.0.0.1:8000/positivepets/picture_search/
但在 chrome 中产生“重定向过多”错误。我想我只是在告诉它一遍又一遍地重定向到自己。
问题
我在哪里指定 picture_search.html
是我想要呈现的模板,而不在视图中对其进行硬编码?
看来答案应该在reverse
,但我只能找到reverse()
的CBV例子,而且我认为它适用于CBV,因为在类定义中设置了一个template_name属性。当然,FBV 没有。
我希望这对于有一些 FBV 经验的人来说是一件容易的事。
【问题讨论】:
这里你重定向到函数本身,所以重定向,将触发相同的视图再次,因此另一个重定向,等等。 【参考方案1】:我认为做你想做的事没有任何好处。您必须在某处通过名称告诉 django 您想要什么模板。如果您在返回时不这样做,但在代码的其他地方,您只是添加了一个抽象层,没有任何净收益。
即
def picture_search(request):
return render(request, reverse('some_pointer'))
some_pointer = 'picture_search'
- 你仍然需要硬编码
= 没有好处
reverse 函数用于从视图或标签中获取 url。
该网址的末尾是一些用于呈现模板的函数,带有模板名称。
【讨论】:
谢谢 - 知道在视图中引用 html 文件名是可以接受的。以上是关于如何让 reverse() 在基于函数的视图中工作的主要内容,如果未能解决你的问题,请参考以下文章