代码之家  ›  专栏  ›  技术社区  ›  Adam

将Django ModelChoiceField更改为显示用户的全名而不是用户名

  •  31
  • Adam  · 技术社区  · 14 年前

    forms.ModelChoiceField(queryset = User.objects.filter(is_staff=False), required = False)
    

    问题是,下拉列表按用户名显示用户,而我更希望它从user.get\u full\u name()显示他们的全名,并且仅当用户名不可用时才使用用户名。我真的只需要这个页面上的更改,在其他地方,如管理,我不在乎它是否使用用户名。

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  74
  •   Bartek    14 年前

    ModelChoiceField 你想要什么标签都可以退货。

    在fields.py或任何适用的地方放置类似的内容。

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

     UserModelChoiceField(queryset=User.objects.filter(is_staff=False), required = False)
    

    可以找到更多信息 here

        2
  •  30
  •   Community pid    7 年前

    class MyModelForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(MyModelForm, self).__init__(*args, **kwargs)
            self.fields['user'].label_from_instance = lambda obj: "%s" % obj.get_full_name()
    

    根据此答案定制 https://stackoverflow.com/a/7805824/432992

        3
  •  2
  •   Mark Lavin    14 年前

    可以使用自定义 ModelChoiceField 然后改变主意 label_from_instance get_full_name 相反。请参阅文档以了解 模型选择字段 http://docs.djangoproject.com/en/1.2/ref/forms/fields/#modelchoicefield

        4
  •  1
  •   lampslave    5 年前

    如果您想更改模型表单中字段的选择,请尝试对Bartek的答案进行以下改编:

    class MyModel(models.Model)
        user = models.ForeignKey(...)
    

    表单域:

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

    形式:

    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
            fields = ['user']
            field_classes = {
                'user': UserModelChoiceField
            }
    

    queryset , required

        5
  •  0
  •   TrisT    4 年前

    您还可以创建一个自定义ModelChoiceField,向其中传递函数。这样,如果要显示不同属性的不同字段,则只能有一个类:

    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(),
    )
    

    如果你正在做一些动态的事情,你也可以不传递任何信息,它基本上默认为一个常规的ModelChoiceField。我不太喜欢蟒蛇,但这对我很有用。