Django模板 - 显示多对多关系

时间:2016-02-16 05:25:07

标签: python django jinja2

在Flask中构建了一些基本应用程序后,我正在学习Django。我想做的一件事是向用户显示所有帖子的列表以及他们是否遵循该帖子。但是,Jinja或Django正在抛出一些我不太了解如何调试的错误。

res[,(2:3) := lapply(.SD, function(x) replace(x, is.infinite(x), NA)),.SDcols= 2:3]

Models.py

class User(models.Model): id = models.AutoField(primary_key=True) username = models.CharField(unique=True, max_length=120,blank=False) password = models.CharField(max_length=120, blank=True, null=False) class Record(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=120, unique=True, blank=True) followers = models.ManyToManyField(User, through='Follow') class Follow(models.Model): id = models.AutoField(primary_key=True) record = models.ForeignKey(Record) user = models.ForeignKey(User) date_followed = models.DateField(null=True, blank=True)

records.html

错误

{% for i in records %}

  {% if i.follow.filter(id='1').first() %}
    DO SOMETHING
  {% endif %}     

{% endfor %}

要在运行TemplateSyntaxError at /records/ Could not parse the remainder: '(id='1').first()' from 'i.follow.filter(id='1').first()' 并执行以下操作时对此进行测试,我没有任何问题:

python manage.py shell

我最初使用Flask制作了这个应用程序的原型,并使用了以下jinja模板,从未出现过问题:

>>> x = Record.objects.first()
>>> x.followers.filter(id='1').first()
  <User: User object>

2 个答案:

答案 0 :(得分:1)

你不能在模板中做那个逻辑。您可以在Record模型中创建一个为您执行此操作的方法,您可以在模板中调用它

class Record(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=120, unique=True, blank=True)
    followers = models.ManyToManyField(User, through='Follow')

    def first_follower(self):
        if self.follow_set.filter(user_id=1).exists():
            return True
        return False

并在模板中:

{% for i in records %}
    {% if i.first_follower %}
         DO SOMETHING
    {% endif %}     
{% endfor %}

答案 1 :(得分:1)

这是设计https://code.djangoproject.com/ticket/1199

这个想法是django模板应该专注于设计,设计师,让更复杂的代码在Python中运行,而不是在模板渲染时。

因此,如果使用此检查时这是一个实例,请将其添加到视图中:

def get_context_data(self,*arg,**kwargs):

  context = super(MyRecordView,self).get_context_data(*args,**kwargs)
  context[has_follow] = self.object.follow.filter_by(user_id='1').exists()
  return context

在模板中:

{% if has_follow %}
...
{% endif %}

但是,如果您经常使用此检查,则可以将其添加到您的模型中:

def has_follow(self):
   return self.follow.filter_by(user_id='1').exists()

然后您可以在模板中访问它,不对视图上下文进行任何更改,因为它是模型属性:

{% if i.has_follow %}
...
{% endif %}