Показать другой профиль в зависимости от типа пользователя - PullRequest
1 голос
/ 24 февраля 2012

У меня есть два типа пользователей.После входа пользователя я перехожу к его профилю пользователя в / profile

. В зависимости от типа пользователя его профиль может содержать различные элементы и формы навигации.Существует ли более простой способ построения навигации на основе типа пользователя вместо размещения тегов {% if%} повсюду в шаблоне.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Не знаю, почему @ dm03514 удалил свой ответ, но я опубликую что-то вроде этого, так как это было бы и моими мыслями.

Если шаблоны достаточно разные, то вы правыветвление повсюду - плохая идея.Это просто сделает ваш шаблон запутанным беспорядком.Так что просто создайте отдельный шаблон для каждого типа пользователя.Затем, по вашему мнению, вы можете выбрать тот или иной шаблон для отображения в зависимости от типа пользователя.Например:

Представления на основе функций старого стиля:

def profile_view(request):
    if request.user.get_profile().type == 'foo':
        template = 'path/to/foo_profile.html'
    elif request.user.get_profile().type == 'bar':
        template = 'path/to/bar_profile.html'
    else:
        template = 'path/to/generic_profile.html' # if you want a default

    return render_to_response(template, {'data': 'data'}, context_instance=RequestContext(request))

Представления на основе классов нового стиля:

class MyView(View):
    def get_template_names(self):
        if self.request.user.get_profile().type == 'foo':
            return ['path/to/foo_profile.html']
        elif self.request.user.get_profile().type == 'bar':
            return ['path/to/bar_profile.html']
        else:
            return ['path/to/generic_profile.html']

Я не уверен, как настроены ваши типы пользователей, но если он основан на строковом значении, вы даже можете создать что-то гораздо более автоматизированное, например:

 template = 'path/to/%s_profile.html' % request.user.get_profile().type

Тогда простосоздайте шаблон для каждого типа на основе этой схемы именования.

И, конечно, каждый шаблон может расширять шаблон base profile.html, позволяя вам исключить некоторые общие функции.

1 голос
/ 24 февраля 2012

Думали ли вы об использовании разрешений для этого? Я делаю то же самое с пользовательскими разрешениями. Самое простое, что auth предоставляет все, что вам нужно, и он всегда есть в запросе.

Будет использован код, очень похожий на предложенный Крисом Паттом:

def profile_view(request):
    if request.user.has_perm('permission_codename_foo'):
        template = 'path/to/foo_profile.html'
    elif request.user.has_perm('permission_codename_bar'):
        template = 'path/to/bar_profile.html'
    else:
        template = 'path/to/generic_profile.html' # if you want a default

    return render_to_response(template, {'data': 'data'}, context_instance=RequestContext(request))

что полезно, так это то, что вы можете защитить свои представления, используя те же разрешения для декораторов:

@permission_required('permission_codename_foo')
def foo():
    #your view here

или если вы хотите проверить альтернативные разрешения:

#user_passes_test(lambda u: u.has_perm('permission_codename_foo') or u.has_perm('permission_codename_bar'))
def foo_or_bar():
    #your view here

django создает целую кучу разрешений по умолчанию, а также именуется: app_name.add_modelname, app_name.change_modelname и app_name.delete_modelname, если необходимо ограничить возможности пользователя

Если вам нужно изменить части шаблонов, попробуйте {% include%}, чтобы загрузить эти части из разных файлов.

1 голос
/ 24 февраля 2012

Создайте модель профиля и свяжите пользователя с этой моделью профиля.(через внешний ключ)

В этом случае модель профиля будет иметь различные атрибуты для разных вариантов поведения.

Эти различные варианты поведения будут затем отображаться в веб-приложении либо путем ветвления шаблона (как вы говорите)используя if в шаблоне) или возвращая различные данные в шаблон или отправляя в функции javascript в конце шрифта для изменения поведения

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...