Django -全局修改User对象的字符串表示(甚至在admin之外)以用于模型表单

jdg4fx2g  于 2023-05-19  发布在  Go
关注(0)|答案(2)|浏览(111)

我的网站有许多ModelForms,每当它有一个外键属性到用户模型,显示的属性是用户名。我怎样才能改变这一点,使其表示为用户的全名(或其他名称)呢?我更倾向于寻找一个全局的解决方案,从现在开始,它将适用于所有的模型表单,但我不会放弃涉及定制每个表单(而不是更改模型)的修复。我正在使用用户模型的userprofile扩展。
到目前为止,我尝试的修复方法是取代user类中的str方法。这是我对模型类的剪辑(取自本论坛的一个条目,顺便说一句)。以下代码位于models.py文件中:

#CUSTOMIZES REPRESENTATION OF USER
def get_full_name(self):
    return self.first_name + ' ' + self.last_name

User.add_to_class("__str__", get_full_name)

谢谢大家!

fhg3lkii

fhg3lkii1#

@pgcd建议的自定义用户模型可能是这里的最佳选择。
但是,如果您想为每个表单单独定制它,那么您可以子类化ModelChoiceField并覆盖label_from_instance

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

然后在表单中使用自定义模型选择字段。

class MyForm(forms.Form):
    user = UserModelChoiceField(queryset=User.objects.all())
jchrr9hc

jchrr9hc2#

您可以简单地使用自定义User模型,并在自定义模型中根据需要覆盖__str__方法。例如:

class User(AbstractUser):
    def __str__(self):
        return self.get_full_name()  # get_full_name() is a standard User method

相关问题