如何让 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() 在基于函数的视图中工作的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在函数视图中调用基于类的通用视图

Djangoreverse函数

LISP 中的 REVERSE 函数

020:reverse函数补充

在 Django 的基于类的视图中模拟函数

如何让 SwiftUI Picker 在子视图中工作? (变灰)