我有一个模型(class Explore
),它与其他类有一个GenericForeignKey关系。我有一个方法(get_renedered_html
)来渲染模板中的对象(explore_photo.html
),这样我就可以直接在主模板(index.html
)中调用探索对象。但我无法在user
中仅获取对象用户的请求/当前explore_photo.html
对象。但是,我可以在主模板(user
)中获取当前/请求index.html
对象。
我在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})
答案 0 :(得分: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 %}
答案 1 :(得分:0)
您需要在'django.core.context_processors.request',
settings.py
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',
)