0

Я строю приложение с django-регистрацией и django-профилями. Всюду на странице у меня есть раздел, отображающий данные текущего пользователя (например, имя и фамилия, используя синтаксис вроде: {{ user.first_name }}), и он отлично работает. Это делается с шаблонами подстраниц, распространяющими один основной шаблон с HTML-структурой и упомянутым разделом.Django {{profile}} глобально доступен в шаблонах

Теперь я пытаюсь добавить изображение пользователя (с помощью {{ profile.image }}) к секции и есть проблема с наличием {{ profile }} переменной шаблона везде, но на следующих страницах:

В settings.py у меня есть:

AUTH_PROFILE_MODULE = 'intranet.UserProfile' 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.static', 
) 

Добавление "django.contrib.auth.context_processors.auth", в TEMPLATE_CONTEXT_PROCESSORS ничего не меняет.

Мой класс UserProfile в models.py является:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    image = models.ImageField(upload_to=user_image_name, 
     blank=True, null=True, verbose_name='User photo') 

urls.py:

(r'^profiles/edit/', 'profiles.views.edit_profile', {'form_class': ProfileForm, }), 
(r'^profiles/', include('profiles.urls')), 

поэтому остальные по умолчанию устанавливается в Джанго профилей urls.py файл.

Я хотел , чтобы иметь возможность использовать{{ profile }}переменную шаблона везде (не только на страницах профилей) в шаблонах приложения, чтобы сделать возможным использовать его в основном шаблоне, который продлен другие.

Пожалуйста, дайте мне знать, как я могу это получить. Любая помощь будет очень оценена.

Я использую Django в версии 1.3.1, django-registration в версии 0.7 и django-профилях в версии 0.2.

ответ

5

думаю, вы хотите user.get_profile().

Если вы используете RequestContext и имеете auth в списке контекстных процессоров в settings.py, то попробуйте {{user.get_profile.image}} и посмотреть, если он делает то, что вы хотите.

+0

Вы правы. Большое спасибо! – user1029968

1

Я думаю, что выше ответ на «Питер Rowell» ответ должен работали для вас в этом конкретном случае из-за следующих причин,

  1. пользователя Объект доступен по «django.contrib.auth.context_processors.auth «контекстный процессор в шаблонах.
  2. Как вы можете использовать все методы доступных объектов Python в контексте шаблона django, доступен метод User.get_profile().

Но если вам нужен любой другой объект (например, ввода объекта с идентификатором = 2 или, если у вас не было «django.contrib.auth.context_processors.auth») в шаблонах можно поставить любые объекты в словаре в шаблон с вашей точки зрения следующим образом

def view_needing_profile(request): 
    c_user = request.user 
    c_profile = c_user.get_profile() 
    c_entry = Entry.objects.get(id=2) 

    return render(request, 'template_using_profile_and_entry.html', 
          {'profile' : c_profile, 'entry' : c_entry })          
1

Вы также можете положить что-то подобное в вашем файле Userprofile приложение models.py

# Fetches the user profile if it exists, otherwise, it creates one User.get_or_create_profile = property(lambda u: Profile.objects.get_or_create(user=u)[0])

Это гарантирует, у ou всегда будет возвращать объект профиля.

Смежные вопросы