Django显示get_full_name()而不是模型形式的用户名

时间:2010-10-19 08:26:03

标签: django django-forms

我有一个引用ForeignKey(User)字段的模型。

当用户选择表单上的项目时,我希望他们能够看到get_full_name()而不只是username

class Books(models.Model):
     author = models.ForeignKey(User)

2 个答案:

答案 0 :(得分:34)

这可以通过多种方式完成。

创建User的代理子类并覆盖其__unicode__()方法以返回用户的全名。

class UserFullName(User):
    class Meta:
        proxy = True

    def __unicode__(self):
        return self.get_full_name()

现在,在您的模型表单中,使用UserFullName来检索用户。

class BookForm(forms.ModelForm):
    author = forms.ModelChoiceField(queryset=UserFullName.objects.all())
    class Meta:
        model = Book

另一种方法是动态填充表单构造函数中的选项。

class BookForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(BookForm, self).__init__(*args, **kwargs)
        users = User.objects.all()
        self.fields['author'].choices = [(user.pk, user.get_full_name()) for user in users]

    class Meta:
        model = Book

也许,lazerscience作为对类似问题 Django forms: how to dynamically create ModelChoiceField labels 的回答,证明了最“djangonic”的方式。它是ModelChoiceField的子类,并覆盖了旨在提供选择标签的label_from_instance()方法。

class UserFullnameChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return smart_unicode(obj.get_full_name())

class BookForm(forms.ModelForm):
    author = UserFullnameChoiceField(queryset=User.objects.all())

    class Meta:
        model = Book

答案 1 :(得分:0)

除了TörökGábor的回答,以下内容可用于ModelMultipleChoiceField

class UserFullnameMultipleChoiceField(ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return smart_unicode(obj.get_full_name())

class BookForm(forms.ModelForm):
    authors = UserFullnameMultipleChoiceField(queryset=User.objects.all(),
                                              help_text=Book.authors.field.help_text)

请注意,我已复制help_text所以默认帮助文本('使用控件或命令选择多个...')。