django模板表现奇怪,或者是吗?

时间:2014-03-08 00:01:55

标签: django django-templates

我有一个类探索,用于获取其他课程的所有照片(例如照片 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>

2 个答案:

答案 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 %}应该可以正常工作。 (好吧,我诚实地认为它会)