【问题标题】:django - current/request user is not passed in the templatedjango - 当前/请求用户未在模板中传递
【发布时间】:2014-03-08 10:05:44
【问题描述】:

我有一个与其他类有 GenericForeignKey 关系的模型 (class Explore)。我有一个方法 (get_renedered_html) 可以在模板 (explore_photo.html) 中渲染对象,这样我就可以直接在主模板 (index.html) 中调用探索对象。但我无法在explore_photo.html 中获取请求/当前user 对象,只有对象的用户。但是我可以在主模板 (index.html) 中获取当前/请求 user 对象。

我在explore_photo.html中试过这个:

<p>{{ object.user }}</p><p>{{ user }}</p>
<p>{{ object.user }}</p><p>{{ request.user }}</p>

它只给我对象的用户,而不是当前/请求用户。

要签入主模板,即index.html,我试过这个:

<body>
    <p>Current user: {{ user }}</p>
    <h1>Explore</h1>
</body>

它确实在主模板中提供了当前用户对象。可能是什么原因?还是我无法为“explore_photo.html”模板提供当前用户对象?请帮我解决这个问题。我真的很感激。谢谢!

这是我的探索模型:

class Explore(models.Model):
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    pub_date = models.DateTimeField()
    content_object = generic.GenericForeignKey('content_type','object_id')

    def get_rendered_html(self):
        template_name = 'explore_photo.html'
        return mark_safe(render_to_string(template_name, {'object': self.content_object}))

explore_photo.html:

{% if object.display == 'P' or user == object.user %}
<div class="explore_photo">
    <img src="media/{{ object.image }}">
    <p class="photo_date">{{ object.pub_date|date:"F jS Y, P" }}</p>
    <p class="photo_description">{{object.description}}</p>
    <p class="photo_user">{{ object.user }}</p>
</div>
{% endif %}

index.html:

<body>
    <p>Current user: {{ user }}</p>
    <h1>Explore</h1>
    <div id="explore">
        {% for photo in photos %}
            {{ photo.get_rendered_html }}
            <hr>
        {% endfor %}
    </div>
</body>

更新:

def explore(request):
    photos = Explore.objects.all()

    return render(request, 'index.html', {'photos':photos})

【问题讨论】:

    标签: django django-templates django-1.6


    【解决方案1】:

    问题是您没有在子模板中使用 RequestContext - 您将无法使用,因为您需要将请求传递给 get_rendered_html 方法,但您不能传递参数进入模板中的方法。

    您应该将其重写为custom inclusion tag,它可以自动获取上下文并呈现模板:

    @register.inclusion_tag('explore_photo.html', takes_context=True)
    def explore(context, obj):
        return {'user': context['user'], 'object': obj.content_object}
    

    并在模板中调用它:

    {% load my_template_tags %}
    ...
        {% for photo in photos %}
            {% explore photo %}
            <hr>
        {% endfor %}
    

    【讨论】:

      【解决方案2】:

      您需要在您的settings.py 中添加'django.core.context_processors.request',

      示例

      TEMPLATE_CONTEXT_PROCESSORS = (
          'django.contrib.auth.context_processors.auth',
          'django.core.context_processors.debug',
          'django.core.context_processors.i18n',
          'django.core.context_processors.media',
          'django.core.context_processors.static',
          'django.core.context_processors.tz',
          'django.contrib.messages.context_processors.messages',
          'django.core.context_processors.request',
      )
      

      【讨论】:

      • 我的设置中没有TEMPLATE_CONTEXT_PROCESSORS!!!我正在使用 django 1.6。那我必须全部添加吗?
      • 不——就是这样。我也使用 dj1.6 并再次仔细检查。
      猜你喜欢
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多