0

私は次のものを持っています:

# 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ですか?

そして、なぜこれを Django で行うのが簡単ではないのでしょうか? (これはやりたいことの一般的なことではありませんか?)

これができない場合は、各列を静的に調べて を使用する必要get_title_displayがあります。つまり、モデルとテンプレートの間に分離がないことを意味します。つまり、モデルを変更すると、テンプレートを手動で更新する必要があります。これは良くない

4

2 に答える 2

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 をループできます

于 2012-10-03T11:28:34.850 に答える
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)
于 2012-10-03T15:01:25.180 に答える