如何在基于函数的视图中使用reverse()

时间:2018-12-20 20:51:27

标签: django view django-templates

我是Django的新手,我想为不需要Model的活动尝试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 个答案:

答案 0 :(得分:0)

我认为做您想做的事情没有任何好处。您必须告诉django您想要在某处按名称命名的模板。如果您不这样做,而是在代码的其他地方,则仅添加了一个抽象层,没有任何净收益。

def picture_search(request):
    return render(request, reverse('some_pointer'))

some_pointer = 'picture_search'-您仍然必须对其进行硬编码

=没有好处

相反的功能是从视图或标签获取URL。

该网址的末尾是一些用于渲染具有模板名称的模板的函数。