Python 默认情况下,在Django中遍历模型并获取列名和.get\u FOO\u显示
我有以下资料:Python 默认情况下,在Django中遍历模型并获取列名和.get\u FOO\u显示,python,django,Python,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
# 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
...
如何在对象客户机
中循环打印列名和值,同时确保如果值是选项
,它打印的是人类可读的选项值,而不是存储值(获取标题显示
)
为什么在Django不能这样做?(这不是一件普通的事情吗?)
如果我不能做到这一点,我必须静态地浏览每一列并使用get\u title\u display
,这意味着模型和模板之间没有分离,这意味着如果我更改模型,我必须手动更新模板。这不好尝试以下方法:
# 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_字段如果您想要获得
get_FOO_显示
,默认情况下,您必须覆盖\u getattribute_uuu
方法。试着这样做:
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)
我使用了if hasattr(self,'get_%s_display'%name)
而不是检查选项的长度