How to set a value of a variable inside a template code?

后端 未结 9 1080
我寻月下人不归
我寻月下人不归 2020-11-27 09:55

Say I have a template


Hello {{name}}!

While testing it, it would be useful to define the

相关标签:
9条回答
  • 2020-11-27 10:09

    Use the with statement.

    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    

    I can't imply the code in first paragraph in this answer. Maybe the template language had deprecated the old format.

    0 讨论(0)
  • 2020-11-27 10:19

    You can use the with template tag.

    {% with name="World" %}     
    <html>
    <div>Hello {{name}}!</div>
    </html>
    {% endwith %}
    
    0 讨论(0)
  • 2020-11-27 10:22

    In your template you can do like this:

    {% jump_link as name %}
    {% for obj in name %}
        <div>{{obj.helo}} - {{obj.how}}</div>
    {% endfor %}
    

    In your template-tags you can add a tag like this:

    @register.assignment_tag
    def jump_link():
        listArr = []
        for i in range(5):
            listArr.append({"helo" : i,"how" : i})
        return listArr
    
    0 讨论(0)
  • 2020-11-27 10:26

    This is not a good idea in general. Do all the logic in python and pass the data to template for displaying. Template should be as simple as possible to ensure those working on the design can focus on design rather than worry about the logic.

    To give an example, if you need some derived information within a template, it is better to get it into a variable in the python code and then pass it along to the template.

    0 讨论(0)
  • 2020-11-27 10:29

    An alternative way that doesn't require that you put everything in the "with" block is to create a custom tag that adds a new variable to the context. As in:

    class SetVarNode(template.Node):
        def __init__(self, new_val, var_name):
            self.new_val = new_val
            self.var_name = var_name
        def render(self, context):
            context[self.var_name] = self.new_val
            return ''
    
    import re
    @register.tag
    def setvar(parser,token):
        # This version uses a regular expression to parse tag contents.
        try:
            # Splitting by None == splitting by spaces.
            tag_name, arg = token.contents.split(None, 1)
        except ValueError:
            raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents.split()[0]
        m = re.search(r'(.*?) as (\w+)', arg)
        if not m:
            raise template.TemplateSyntaxError, "%r tag had invalid arguments" % tag_name
        new_val, var_name = m.groups()
        if not (new_val[0] == new_val[-1] and new_val[0] in ('"', "'")):
            raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name
        return SetVarNode(new_val[1:-1], var_name)
    

    This will allow you to write something like this in your template:

    {% setvar "a string" as new_template_var %}
    

    Note that most of this was taken from here

    0 讨论(0)
  • 2020-11-27 10:30

    The best solution for this is to write a custom assignment_tag. This solution is more clean than using a with tag because it achieves a very clear separation between logic and styling.

    Start by creating a template tag file (eg. appname/templatetags/hello_world.py):

    from django import template
    
    register = template.Library()
    
    @register.assignment_tag
    def get_addressee():
        return "World"
    

    Now you may use the get_addressee template tag in your templates:

    {% load hello_world %}
    
    {% get_addressee as addressee %}
    
    <html>
        <body>
            <h1>hello {{addressee}}</h1>
        </body>
    </html>
    
    0 讨论(0)
提交回复
热议问题