2010-11-02 73 views
2

我在寫一個通用模板標籤,可以根據模板文件中的用戶輸入動態返回模型的字段值。這個想法跟在「Practical Django Project 2nd Edition」一書中提到的那個概念,但是這本書的版本正在獲得一個我只想獲取對象價值的對象列表。我想獲取站點設置(標題,標語等)並動態傳遞模板,以便我不必再次編寫代碼來獲取每個字段的值。Django:如何使用自定義模板標籤動態獲取字段值?

這是我迄今爲止所做的。

定義一個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> 

我已經嘗試了所有我能想到的,但只是無法得到它的工作原理的可能途徑。任何幫助真的很感激。謝謝。

回答

4

我發現這種情況的解決方案:

註釋行上,使用此代碼:

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 
+0

這可能是一個可能的解決方案,如果您有任何其他解決方案,請建議! – duy 2010-11-02 05:42:35

+3

或更多Django-ey,而不是** var .__ dict __ [self.field] **你可以** var._meta.get_field(self.field)** – Anentropic 2011-10-17 13:40:04

4

在Python正常的方式來獲得他的名字,你在另一個變量是使用屬性getattr

context[self.varname] = getattr(var, self.field) 
相關問題