2016-07-18 12 views
1

Как я могу захватить определенный пользовательский объект в свой шаблон? Я знаю, что могу сделать цикл for, как это, если я создам контекстный процессор:Получите определенное поле пользователя «на лету» с помощью обработчиков контекста Django?

{% for user in users %} 
    {{ user.profile.about }} 
{% endfor %} 

Но это будет проходить через все из них. Если бы я хотел получить поле профиля пользователя на лету, как я мог это сделать?

Что-то вроде этого псевдо-код ниже:

{{ user.profile.about <username> }} 

Основываясь на подобласти Я на Я получил домен, который является имя пользователя, а также, я хочу использовать, чтобы захватить информацию о пользователе. Как я могу получить профиль пользователя?

+1

Вам нужно быть более конкретным. Откуда «имя пользователя»? Почему вы не можете отправлять данные из представления или в контекстный процессор? –

+0

Прежде всего, вы должны создать функцию в своем контроллере, которая возвращает определенное поле, которое вам нужно, на основе определенных параметров, например 'user_id'. – user3041764

+0

@ DanielRoseman Я могу отправить данные из контекстного процессора, но не из представления. Я не знаю, как написать код в обработчике контекста, чтобы сделать то, что я хочу достичь. –

ответ

1

Если это будет использоваться на каждой странице в подобласти, вы можете создать template context processor:

Контекст процессор имеет очень простой интерфейс: Это просто функция Python, которая принимает один аргумент, HttpRequest объект и возвращает словарь, который добавляется в контекст шаблона. Каждый процессор контекста должен возвращать словарь.

from django.contrib.auth import get_user_model 
from django.shortcuts import get_object_or_404 

def user_subdomain(request): 
    host = request.META['HTTP_HOST'] 
    subdomain = host.split('.')[0] # Or whatever more accurate parsing if needed 
    User = get_user_model() 
    user = get_object_or_404(User, username=subdomain) 
    return { 
     'subdomain_user': user, # avoid naming it `user` as this is 
           # the current signed in user 
    } 

И добавить контекст процессора в настройки:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     ... 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       ... 
       'yourapp.context_processors.user_subdomain', 
      ], 
     }, 
    } 
] 

Затем в шаблонах, вы можете получить этот пользователь в {{ subdomain_user }}.

+0

Только один вопрос. Если я не на субдомене, как я могу заставить его не возвращаться к контексту? –

+0

Вы можете вернуть пустой словарь или '{'subdomain_user': None}', если вы не можете найти действительный субдомен. Вам также потребуется улучшить парсинг доменов. –