Как мне заставить reverse () работать в представлении на основе функций - PullRequest
0 голосов
/ 20 декабря 2018

Я новичок в 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, но я могу найти только примеры CBV reverse(), и я думаю, что он работает с CBV, потому что в определении класса установлен атрибут template_name.У FBV этого, конечно, нет.

Я надеюсь, что это легко для кого-то с некоторым опытом FBV.

1 Ответ

0 голосов
/ 21 декабря 2018

Я не думаю, что в том, что вы пытаетесь делать, есть какая-то польза.Вы должны сказать django, какой шаблон вы хотите по имени где-либоЕсли вы не сделаете это по возвращении, а где-то еще в своем коде, вы добавили только слой абстракции без какой-либо чистой выгоды.

т.е.

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

some_pointer = 'picture_search' - вам все равно придется жестко его кодировать

= Нет пользы

обратная функция для получения URLиз представления или надписи.

В конце этого URL-адреса есть некоторая функция для отображения шаблона с именем шаблона.

...