Для начала, что значит иметь разных типов пользователей? Очень простой способ сделать это - сохранить атрибут у пользователя. Таким образом, при наличии объекта user
вы можете посмотреть на этот дополнительный атрибут, чтобы определить, относится ли пользователь к специальному типу. Django имеет стандартный механизм хранения дополнительных атрибутов, таких как этот, о котором вы можете прочитать здесь .
Если у вас есть способ определения пользовательских типов, вы можете создать один декоратор и применить его к любому представлению, которое должно вести себя так, как вы описали. Декораторы - отличный способ применения дополнительных условий или поведения к существующим функциям. Логика в декораторе начинает работать до и / или после существующей функции, поэтому она может очень легко выполнить что-то вроде отображения другого шаблона в зависимости от типа пользователя.
Функции декоратора выглядят очень странно, когда вы впервые сталкиваетесь с ними, но прочитайте их внимательно, и вы скоро получите их. Декоратор - это сама функция, и вы даете ей функцию, которую хотите декорировать. Он возвращает вам новую функцию, которая является вашей старой функцией, обернутой дополнительной логикой.
Я написал несколько непроверенных примеров кода ниже.
def template_based_on_user_type(special_template, ordinary_template):
def decorator(your_view_function):
def inner_decorator(request, *args, **kwargs):
# this is the logic that checks the user type before
# every invocation of this view:
if request.user.type == 'special_type':
template = special_template
else:
template = ordinary_template
# this is the invocation of the view function, with
# a custom template selected:
return your_view_function(request, template)
return inner_decorator
return decorator
@template_based_on_user_type('my-special-template.html', 'ordinary-template.html')
def my_view_function(request, template='default.html'):
# Do what you need to do here
render_to_response(template, data, RequestContext(request)
Синтаксис для применения декоратора - символ «@», за которым следует функция декоратора. Декоратор настраивается с указанными именами шаблонов.