Django {{profile}}在模板中全局可用

时间:2012-04-29 21:45:00

标签: django templates django-templates profiles django-profiles

我正在使用django-registration和django-profiles构建应用程序。在页面的任何地方,我都有显示当前登录用户数据的部分(如名字和姓氏,使用如{{ user.first_name }}这样的语法),它可以正常工作。它是通过子页面模板完成的,这些模板扩展了一个带有HTML结构的主模板和上面提到的部分。

现在我尝试将用户图片(使用{{ 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不会改变任何内容。

models.py 中的我的UserProfile类是:

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')),

所以其余部分默认设置在 django-profiles urls.py 文件中。

我希望能够在应用程序的模板中使用 {{ profile }} 模板变量(不仅在配置文件页面上)来实现它可以在其他人扩展的主模板中使用它。

请让我知道如何才能得到这个。任何帮助将非常感激。

我在版本1.3.1中使用Django,在版本0.7中使用django-registration,在版本0.2中使用django-profiles。

3 个答案:

答案 0 :(得分:5)

我想你想要user.get_profile()

如果您在RequestContext的上下文处理器列表中使用auth并拥有settings.py,请尝试{{user.get_profile.image}}并查看它是否符合您的要求。

答案 1 :(得分:1)

由于以下原因,我认为上述“彼得罗威尔”的答案在这个具体案例中一定对您有用,

  1. 用户对象可通过模板中的“django.contrib.auth.context_processors.auth”上下文处理器获得。
  2. 由于您可以在django模板上下文中使用可用Python对象的所有方法,因此可以使用User.get_profile()方法。
  3. 但是如果你需要任何其他对象(例如,id为2的Entry对象,或者如果你没有“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 } )                                    
    

答案 2 :(得分:1)

你也可以在你的userprofile app 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])

这可确保您始终返回个人资料对象。