【问题标题】:Django: How to get field value dynamically using custom template tags?Django:如何使用自定义模板标签动态获取字段值?
【发布时间】:2010-11-02 04:32:56
【问题描述】:

我正在编写一个通用模板标签,它可以根据模板文件中的用户输入动态返回模型的字段值。遵循“实用 Django 项目第 2 版”一书中提到的想法,但该书的版本是获取对象列表,我只想获取对象的值。我想获取站点设置(标题、标语等)并动态传递模板,这样我就不必再次编写代码来获取每个字段的值。

这是我到目前为止所做的。

为模型定义一个 admin.py(这里不包括,因为它不重要)

定义了一个模型:

from django.db import models
from django.contrib.sites.models import Site

class Naming(models.Model):
    title = models.CharField(max_length=250)
    site_id = models.ForeignKey(Site)
    tagline = models.CharField(max_length=250)
    description = models.TextField(blank=True)

    def __unicode__(self):
        return self.title

定义了一个模板标签文件,注释行是我卡住的地方

from django.db.models import get_model
from django.contrib.sites.models import Site
from django import template

def do_site_att(parser, token):
    bits = token.split_contents()
    if len(bits) != 5:
        raise template.TemplateSyntaxError("'get_site_att' tag takes exactly four arguments")
    model_args = bits[1].split('.')
    if len(model_args) != 2:
        raise template.TemplateSyntaxError("First argument to 'get_site_att' must be an 'application name'.'model name' string.")
    model = get_model(*model_args)
    if model is None:
        raise template.TemplateSyntaxError("'get_site_att' tag got an invalid model: %s." % bits[1])
    return ContentNode(model, bits[2], bits[4])

class ContentNode(template.Node):
    def __init__(self, model, field, varname):
        self.model = model
        self.field = field
        self.varname = varname

    def render(self, context):
        current_site = Site.objects.get_current()
        try:
            var = self.model.objects.get(site_id=current_site.id)
            context[self.varname] = var.title #I get stuck here because it not accepts input like var.field (I have extract the field value above)
        except:
            context[self.varname] = "Value not found"
        return ''


register = template.Library()
register.tag('get_site_att', do_site_att)

base.html中的模板查询:

{% load general_tags %}
{% get_site_att general.Naming title as title %}
<h1 id="branding">{{title}}</h1>
{% get_site_att general.Naming tagline as tagline %}
<h2 id="tagline">{{tagline}}</h2>

我已经尝试了我能想到的所有可能的方法,但就是无法奏效。非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: python django dynamic model templatetags


    【解决方案1】:

    我找到了解决方案:

    在注释行中,使用以下代码:

    var = self.model.objects.get(site_id__exact=current_site.id)
    context[self.varname] = var.__dict__[self.field]#this will get the field's value dynamically, which is what I was looking for
    

    【讨论】:

    • 这可能是一种可能的解决方案,如果您有任何其他解决方案,请提出建议!
    • 或更多 Django-ey,而不是 var.__dict__[self.field] 你可以 var._meta.get_field(self.field)
    【解决方案2】:

    在 Python 中获取名称在另一个变量中的属性的常规方法是使用 getattr

    context[self.varname] = getattr(var, self.field)
    

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2015-01-20
      • 2015-03-03
      • 2012-03-15
      • 2011-08-31
      相关资源
      最近更新 更多