関数を渡すことができる1つのカスタムModelChoiceFieldを作成することもできます。そうすれば、さまざまな属性を表示するさまざまなフィールドがある場合、クラスは1つだけになります。
class CustomModelChoiceField(forms.ModelChoiceField):
name_function = staticmethod(lambda obj: obj)
def __init__(self, name_function, *args, **kwargs):
if not name_function is None: self.name_function = name_function
super(CustomModelChoiceField, self).__init__(*args, **kwargs)
def label_from_instance(self, obj):
return self.name_function(obj);
次に、次のように簡単に呼び出すことができます。
form_field = CustomModelChoiceField(
lambda obj: obj.get_full_name(),
queryset=Whatever.objects.all(),
)
動的な処理を行う場合は、Noneを渡すこともできます。これは、基本的にデフォルトで通常のModelChoiceFieldになります。私はあまりPythonの人ではありませんが、これは私にとってはうまくいきます。