Требуется декоратор входа в систему с множеством возможных HTML-кодов для одного и того же URL-адреса

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

Перед добавлением декоратора в urls.py у меня есть следующее:

url(r'^search/(?P<search_type>\w+)', search)

Вышеупомянутая функция поиска немного сложна тем, что в зависимости от различных условий она будет отображать одну из четырех возможных html-страниц.

Я не вижу в документах способа обработки нескольких html-страниц с помощью декоратора и не могу понять правильный синтаксис.

Я попытался использовать декоратор с одной из четырех html-страниц, и он работает для этой одной html-страницы:

from django.views.generic import TemplateView

url(r'^search/(?P<search_type>\w+)',
    login_required(TemplateView.as_view(template_name='search_form.html',), search)),

Но как мне потребовать логин для всех возможных html? Например, я пробовал такие вещи, как:

 url(r'^search/(?P<search_type>\w+)',
    login_required(TemplateView.as_view(template_name='search_form.html',), TemplateView.as_view(template_name='search_form_manual.html',), search)),

Я также попытался создать подкласс общих представлений:

//в view.py

from django.views.generic import TemplateView

class AboutView(TemplateView):
template_name_1 = "search_form.html"
template_name_2 = "search_form_manual.html"
template_name_3 = "search_results.html"
template_name_4 = "tag_search_results.html"

//в urls.py

from views import AboutView

url(r'^search/(?P<search_type>\w+)',
    login_required(AboutView.as_view(template_name_1, template_name_2,), search)),

Но я получаю сообщение об ошибке, что имя_шаблона_1 и имя_шаблона_2 не существует...

Любая помощь приветствуется.


person jac300    schedule 27.06.2013    source источник
comment
Независимо от использования декоратора, я не вижу, как вы можете заменить представление на основе функций search() одним TemplateView, если вам нужно использовать несколько шаблонов. Что не так с url(r'^search/(?P<search_type>\w+)', login_required(search))?   -  person Aya    schedule 27.06.2013
comment
Какое представление обрабатывает ваши запросы функции поиска до того, как вы настроите обязательные входы в систему? Это вид, который вы должны украсить.   -  person Peter DeGlopper    schedule 27.06.2013
comment
login_required(search) отлично работает - спасибо. Я не понимал, что могу это сделать.   -  person jac300    schedule 27.06.2013


Ответы (1)


Используйте это с представлением класса

из django.views.generic импортировать TemplateView

class AboutView(TemplateView):

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)

    template_name_1 = "search_form.html"
    template_name_2 = "search_form_manual.html"
    template_name_3 = "search_results.html"
    template_name_4 = "tag_search_results.html"
person lalo    schedule 27.06.2013