【问题标题】:How to override default display values for a select field for foreign keys in the Django Admin?如何覆盖 Django Admin 中外键选择字段的默认显示值?
【发布时间】:2013-04-28 11:26:03
【问题描述】:

我正在创建模型,其中每个模型都应与用户相关,如下所示:

class Item(models.Model):
    user = models.ForeignKey(User)

但是在 Django Admin 中,对于 Item,它会显示一个 select 字段,其中所有用户都按用户名列出。除了他们的用户名,我还需要显示每个用户的first_namelast_name

如何在 Django 管理界面的选择列表中同时显示所有三个字段?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您需要为此创建自定义Form 并在ModelAdmin 中设置表单属性。

    Form 中,您需要将模型上user 字段的表单字段类型覆盖为自定义ModelChoiceField

    ModelChoiceField 有一个名为label_from_instance 的方法,您需要重写它才能获得全名。

    示例代码

    ######################################
    ## models.py ##
    ######################################
    
    from django.db import models
    from django.contrib.auth.models import User
    
    class Item(models.Model):
        user = models.ForeignKey(User)
        name = models.CharField("name", max_length=60)
    
        def __unicode__(self):
            return self.name
    
    ######################################
    ## forms.py ##
    ######################################
    
    from django import forms
    from django.contrib.auth.models import User
    
    from .models import Item
    
    
    class CustomUserChoiceField(forms.ModelChoiceField):
        def label_from_instance(self, obj):
             return obj.get_full_name()
    
    
    class ItemForm(forms.ModelForm):
        user = CustomUserChoiceField(queryset=User.objects.all())
    
        class Meta:
            model = Item
    
    ######################################
    ## admin.py ##
    ######################################
    
    from django.contrib import admin
    
    from .models import Item
    from .forms import ItemForm
    
    
    class ItemAdmin(admin.ModelAdmin):
        form = ItemForm
    
    
    admin.site.register(Item, ItemAdmin)
    

    源代码参考

    https://github.com/django/django/blob/1.4.5/django/forms/models.py#L948

    相关问题

    1. Django admin - change ForeignKey display text
    2. Django forms: how to dynamically create ModelChoiceField labels
    3. Change Django ModelChoiceField to show users' full names rather than usernames
    4. Django show get_full_name() instead or username in model form
    5. django: customizing display of ModelMultipleChoiceField
    6. django how to display users full name in FilteredSelectMultiple
    7. Django ModelChoiceField drop down box custom population
    8. customize select in django admin
    9. Use method other than unicode in ModelChoiceField Django

    【讨论】:

    • 这是一个很好的答案。谢谢你的帮助。
    • 感谢您的回答。我认为最后一行有一个错字。它应该是“admin.site.register(Item, ItemAdmin)”。
    • 谢谢!!我已经修正了那个错字:-)
    【解决方案2】:

    Django 在很多地方都使用了 unicode(obj)(或相关函数 str(obj))。最值得注意的是,在 Django 管理站点中显示对象,并在显示对象时作为插入模板的值。

    请从https://docs.djangoproject.com/en/dev/ref/models/instances/查看__unicode__

    您可以更改用户类的__unicode__ 方法。请参阅下面的示例代码。

    from django.db import models
    from django.contrib.auth.models import User
    
    def myunicode(self):
        return self.get_full_name()
    
    # Create your models here.
    class Item(models.Model):
        User.__unicode__ = myunicode
        user = models.ForeignKey(User)
        name = models.CharField("name", max_length=60)
    
        def __unicode__(self):
            return self.name
    

    【讨论】:

    • 是的,但是在为models.ForeignKey(User) 生成的选择列表的情况下,被调用的unicode 函数就是User 的函数,所以你仍然会得到一个用户名列表。
    • 是的。但是,如何在运行时将 User 类的 __unicode__ 方法更改为我自己的方法?请通过示例查看我的更新答案。
    • 这是有风险的。由于这是 Django 本身的一部分,并且其他应用程序可以使用它,因此您可能会从其他应用程序获得意外行为,这些应用程序期望 unicode 返回用户名。自定义表单将更改限制在需要它的部分。顺便说一句,你也可以User.__unicode__ = lambda s: s.get_full_name()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2017-04-26
    • 2017-01-22
    相关资源
    最近更新 更多