我有一个类探索,用于获取其他课程的所有照片(例如照片, ProfilePicture 等)。在Explore类中,我有一个方法(get_rendered_html
),用于渲染模板中的对象(explore_photo.html
),以便我可以将其传递给主页面{{1} })。
更新
请让我详细说明我的问题。假设有三个用户 A , B 和 C 。如果 A 是当前用户,我希望显示 A 的所有照片,包括 B 和 C的其他PUBLIC照片
我试过了:
index.html
如果我这样做,即使当前用户是对象的用户,也只显示公共图像。如果我这样做:
{% if object.display == 'P' or user == object.user %}
{% if object.display == 'P' or request.user == object.user %}
显示所有图像。
这可能是什么原因?请帮我解决这个问题。我非常感谢您的建议或建议。谢谢。
{% if object.display == 'P' or user != object.user %}
explore_photo.html:
class Photo(models.Model):
ONLYME = 'O'
FRIENDS = 'F'
PUBLIC = 'P'
CHOICES = (
(ONLYME, "Me"),
(FRIENDS, "Friends"),
(PUBLIC, "Public"),
)
display = models.CharField(default='F', max_length=1, choices=CHOICES, blank=True, null=True)
user = models.ForeignKey(User)
description = models.TextField()
pub_date = models.DateTimeField(auto_now=True, auto_now_add=False)
update = models.DateTimeField(auto_now=False, auto_now_add=True)
image = models.ImageField(upload_to=get_upload_file_name, blank=True)
class Meta:
ordering = ['-pub_date']
verbose_name = 'photo'
verbose_name_plural = 'photos'
def __unicode__(self):
return self.description
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}))
的index.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 %}
更新
<body>
<h1>Explore</h1>
<div id="explore">
{% for photo in photos %}
<p>1</p>
{{ photo.get_rendered_html }}
<hr>
{% endfor %}
</div>
</body>
答案 0 :(得分:2)
免责声明:我不熟悉GenericForeignKey,我不明白为什么在Explore中有用户FK。我确定一件事:过滤应该在视图中完成,而不是在模板中完成!使用类似的东西:
photos = Explore.objects.filter(content_object__display='P',
content_object__user=request.user)
# But as I said, I don't understand this Explore model, so I would probably
# delete it and use Photo directly
photos = Photo.objects.filter(display='P', user=request.user)
现在您可以删除模板中的条件,它应该可以正常工作。
修改强>
我的不好,你需要一个OR查询,而不是AND。请改用过滤器中的Q objects。
from django.db.models import Q
photos = Photo.objects.filter(Q(display='P') | Q(user=request.user))
# Idem for the Explore model or any other model where you need a OR or a
# complex query.
答案 1 :(得分:0)
您可能希望比较 User.pk 而不是用户对象。
在这一行:{% if object.display == 'P' or user == object.user %}
和其他涉及user,object.user或request.user的行中,django不保证对象是相等的,即使它们应该是。要将对象与另一个对象进行比较,您需要比较它们持有的一些值,比较主键(user.pk)是一种约定。
{% if object.display == 'P' or user.pk == object.user.pk %}
应该可以正常工作。 (好吧,我诚实地认为它会)