【问题标题】:django how to display users full name in FilteredSelectMultipledjango 如何在 FilteredSelectMultiple 中显示用户全名
【发布时间】:2011-09-22 07:05:43
【问题描述】:

我正在尝试使用 FilteredSelectMultiple 小部件来显示用户列表。目前它只显示用户名。我试图覆盖 label_from_instance 如下所示,但它似乎不起作用。怎么才能显示用户全名。

class UserMultipleChoiceField(FilteredSelectMultiple):
    """
    Custom multiple select Feild with full name
    """                                                                                                                                                                 
    def label_from_instance(self, obj):
              return "%s" % (obj.get_full_name())

class TicketForm(forms.Form):
    cc_to  = forms.ModelMultipleChoiceField(queryset=User.objects.filter(is_active=True).order_by('username'), widget=UserMultipleChoiceField("CC TO", is_stacked=True)

【问题讨论】:

    标签: python django


    【解决方案1】:

    (供日后参考)

    您应该改为继承 ModelMultipleChoiceField:

    class UserMultipleChoiceField(forms.ModelMultipleChoiceField):
        """
        Custom multiple select Feild with full name
        """
        def label_from_instance(self, obj):
              return obj.get_full_name()
    
    
    class TicketForm(forms.Form):
        cc_to  = UserMultipleChoiceField(
                queryset=User.objects.filter(is_active=True).order_by('username'),
                widget=FilteredSelectMultiple("CC TO", is_stacked=True)
            )
    

    另一种解决方案是将 User 子类化并在您的查询集中使用它在这个问题中:Django show get_full_name() instead or username in model form

    class UserFullName(User):
        class Meta:
            proxy = True
            ordering = ["username"]
    
        def __unicode__(self):
            return self.get_full_name()
    
    class TicketForm(forms.Form):
        cc_to  = forms.ModelMultipleChoiceField(
                queryset=UserFullName.objects.filter(is_active=True),
                widget=FilteredSelectMultiple("CC TO", is_stacked=True)
            )
    

    【讨论】:

      【解决方案2】:

      有点晚了,但我认为它可能会帮助人们尝试解决类似的问题:http://djangosnippets.org/snippets/1642/

      【讨论】:

        【解决方案3】:

        最简单的解决方案是将以下内容放入导入django.contrib.auth.models.Usermodels.py 中:

        def user_unicode_patch(self):
            return '%s %s' % (self.first_name, self.last_name)
        
        User.__unicode__ = user_unicode_patch
        

        这将使用自定义函数覆盖 User 模型的 __unicode__() 方法,显示您想要的任何内容。

        【讨论】:

        • 我喜欢这种方法,但更喜欢return self.get_full_name() 以避免重新定义名称的呈现方式。
        • 只是我的一个小小的改进:User.__str__ = lambda user: user.get_full_name() or user.get_username()
        【解决方案4】:

        我认为你必须重写用户模型 unicode 方法。您可以创建新模型,如下所示:

        class ExtendedUser(User): # inherits from django.contrib.auth.models.User
            def __unicode__(self):
                return '%s %s' % (self.first_name, self.last_name)
        

        【讨论】:

          【解决方案5】:

          我做了与 jnns 相同的操作,并覆盖了 _meta 排序列表,以按用户全名排序用户列表。

          # hack for displaying user's full name instead of username and order them by full name
          def user_unicode_patch(self):
              return '%s %s' % (self.first_name, self.last_name)
          User.__unicode__ = user_unicode_patch
          User._meta.ordering = ['first_name', 'last_name']
          

          我在 UserProfile 模型文件中添加了这个。 我不认为这是最好的方法,但肯定非常简单实用。在 Django 1.4 中测试

          对于 Django 1.5 之后的版本,这样做会更容易,因为我们可以更好地控制 User 模型。

          【讨论】:

            【解决方案6】:

            假设您的模型是

            class UserProfile(models.Model) :
                first_name = models.CharField(max_length=255, blank=True)
                second_name = models.CharField(max_length=255, blank=True)
            
                def full_name(self):
                    """
            
                    : Return the first_name plus the last_name, with space in between.
                    """
                    full_name = '%s %s' % (self.first_name, self.second_name)
                    return full_name.strip()
            

            【讨论】:

            • 您是否遗漏了部分答案?没有解释,文字似乎完全不合适
            • @Zoe 只是描述了当你不想使用 Django 在模型上定义名字和姓氏等名称时如何获取全名
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-19
            • 2011-03-11
            • 2015-05-06
            • 2021-04-18
            • 1970-01-01
            • 2018-12-31
            • 2023-03-19
            相关资源
            最近更新 更多