代码之家  ›  专栏  ›  技术社区  ›  Val Neekman

Django模板将模板中变量的值传递给TemplateTags筛选器

  •  1
  • Val Neekman  · 技术社区  · 16 年前

    名称类一个id,一个first&a last属性

    在view.py中,我从数据库中获取一个name对象,并将其传递到index.html模板中。

    在我的 templagetags/my_tags.py ,我有一个过滤器 my_private_tag(value, arg) 这需要一个值和一个参数。它将arg附加到值并返回结果。

    def my_private_tag(value, arg):
      return value + ' ' + arg
    

    在index.html标记中,我需要执行以下操作。

    {% if name %}
    
      # to display 
      # John says hello
      {{name.first | my_private_tag:"says hello"}
    
      # Johns student id = id_value
      {{name.first | my_private_tag:"????????"}
    
      # Johns student id = id_value, lastname = lastname_value
      {{name.first | my_private_tag:"????????"}
    
    {% endif %}
    

    哪里:

    id_value = name.id & lastname_value = name.last
    

    请填写??????????如果可以的话。

    3 回复  |  直到 9 年前
        1
  •  8
  •   Nadia Alramli    16 年前

    而不是实现你自己的过滤器。为什么不这样做:

    {{name.first }} says hello
    {{name.first }}'s student id = {{ name.id }}
    

    它可读性更强。这就是你应该如何使用模板。

    如果仍要为此使用自定义筛选器,则可以传递如下变量:

    {{name.first|my_private_tag:name.id}}
    
        2
  •  0
  •   Dave W. Smith    16 年前

    如果过滤器只有两个字符串,那么它将无法访问原始的name对象,因此无法获取id。

    我认为当你可以使用现有的标签来得到你想要的结果时,你想用一个过滤器来做这件事是错误的。但是,为了争论,假设你可以

    Johns student id = 47, lastname = Doe
    

    从过滤器。你会怎么做?首先,必须将name对象传递给过滤器

    {{name|my_private_tag:"??????"}}
    

    然后过滤器的代码变为

    return name.first_name + "s student id = " + name.id + ", lastname = " + name.last_name
    

    请注意,您没有使用参数。如果希望过滤器根据参数返回不同的内容,则添加条件逻辑并关闭。

        3
  •  0
  •   Risadinha    9 年前

    如果需要一个仅由业务逻辑指定的模型字段值组合组成的值,则templateTag不是正确的方法。

    相反,这应该是模型的属性:

    class Student(models.Model):
        firstname = models.CharField(...)
        lastname = models.CharField(...)
    
        @property
        def student_id(self):
            return '{}{}'.format(self.id, self.lastname)
    

    您可以在任何地方使用此属性,不仅在模板中,而且在视图、导出、管理用户界面等中,您可能需要看到 student_id 听起来是一个相当重要的属性。

    在模板中:

    {% if student %}
    
      # to display 
      # John says hello
      {{ student.firstname }} says hello
    
      # John's student id
      Student ID: {{ student.student_id }}
    
    {% endif %}
    

    应该为更通用的功能和依赖于当前请求的功能而创建templatetags,而不是只应用于特定上下文中的一个特定模型。而且,最重要的是,它们不适用于不限于模板的功能。

    推荐文章