2012-10-03 57 views
0

越来越列名和.get_FOO_display我有以下几点:通过Django模型循环,默认情况下

# model 

TITLE_CHOICES = (
    ('mr', 'Mr.'), 
    ('ms', 'Ms.'), 
    ('mrs', 'Mrs.'), 
    ('mis', 'Miss.'), 
) 
class Client(models.Model): 
    name_title = models.CharField(max_length=3, choices=TITLE_CHOICES) 
    first_name = models.CharField(max_length=40) 
    last_name = models.CharField(max_length=40) 

# form 
class ClientForm(ModelForm): 
    class Meta: 
     class = Client 

# view 
def client_view(request): 
    client = Client.object.get(id=1) 
    clientForm = ClientForm(instance=client) 
    return render_to_response('client.html',{'client':client, 
              'clientForm':clientForm}, ...) 

# client.html 
... 

我怎么能同时确保遍历对象client打印出来的列名和值,如果值是choice它打印出人类可读的选择值,而不是存储的值(get_title_display)?

为什么这不是eaiser在Django中做的? (这不是常见的事情要做吗?)

如果我不能这样做,我必须静态通过每列,并使用get_title_display,这意味着模型和模板之间没有分离,这意味着如果我改变我的模型,我不得不手动更新模板。这是不好的

回答

1

尝试类似:

# add to your Client model  
def get_fields(self): 
    fields_display = [] 
    for f in Client._meta.fields: 
     name = f.name   
     if len(f.choices) == 0: 
      fields_display.append([name, f.value_to_string(self)]) 
     else: 
      fields_display.append([name, getattr(self,"get_%s_display" % name)()]) 

    return fields_display 

然后可以循环遍历模板get_fields给定对象

0

如果你想获得默认get_FOO_display,你必须覆盖__getattribute__方法。试试这样的:

class FooModel(models.Model): 
    ... 
    def __getattribute__(self, item): 
     get = lambda i: object.__getattribute__(self, i) 
     name_map = get('_meta')._name_map 

     if item.startswith('_') or name_map.has_key(item): 
      return get(item) 

     else: 
      field = name_map.get(item) 
      if field.choices: 
       return get('get_%s_display' % item)() 

      else: 
       return get(item)