sow*_*bug 3 django django-templates
我有以下型号:
class Post(models.Model):
message = models.TextField()
(etc.)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
(etc.)
class PostFollow(models.Model):
post = models.ForeignKey(Post, related_name='follower_set')
follower = models.ForeignKey(UserProfile, related_name='follower_set')
creation_date = models.DateTimeField(auto_now_add=True)
an_arbitrary_score = models.IntegerField(default=0)
(etc.)
class Meta:
unique_together = ('post', 'follower',)
Run Code Online (Sandbox Code Playgroud)
在我的模板中,我想呈现帖子列表以及"关注"或"取消关注"链接,以便当前用户可以决定是否关注给定帖子.在我可以在Django模板中使用参数的世界中,我会做这样的事情:
{% for post in post_set %}
<...stuff...>
{% if post.user_is_following user %}unfollow{% else %}follow{% endif %}
<...more stuff...>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
但是,我做不到.而且我无法在任何这些模型上创建零参数,模板可调用方法,因为它们都需要知道至少一个其他参数来回答该表中是否存在给定PostFollow行的问题.
我很高兴写一个模板延伸,但在我拿出大枪之前,这是否适合这样做呢?或者是否有更多Djangoesque解决方案?
模板过滤器不是大枪:
# your_app/templatetags/following.py
from django import template
register = template.Library()
@register.filter
def is_followed_by(post, user):
return post.is_followed_by(user)
Run Code Online (Sandbox Code Playgroud)
然后:
{% load following %}
...
{% if post|is_followed_by:user %} ... {% endif %}
Run Code Online (Sandbox Code Playgroud)
您还可以将所有逻辑放在模板过滤器中,删除'post.is_followed_by'方法并使用过滤器代替模型方法,就像任何其他函数一样,@ register.filter装饰器不会损坏装饰函数.
归档时间: |
|
查看次数: |
134 次 |
最近记录: |