8

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

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

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

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

4

2 回答 2

16

您需要为此创建自定义Form并在ModelAdmin.

在这种情况下,Form您需要将user模型上字段的表单字段类型覆盖为 custom 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 - 更改 ForeignKey 显示文本
  2. Django 表单:如何动态创建 ModelChoiceField 标签
  3. 更改 Django ModelChoiceField 以显示用户的全名而不是用户名
  4. Django 以模型形式显示 get_full_name() 或用户名
  5. django:自定义 ModelMultipleChoiceField 的显示
  6. django 如何在 FilteredSelectMultiple 中显示用户全名
  7. Django ModelChoiceField 下拉框自定义填充
  8. 在 django admin 中自定义选择
  9. 在 ModelChoiceField Django 中使用除unicode之外的方法
于 2013-05-04T05:21:49.360 回答
2

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

参阅__unicode__https://docs.djangoproject.com/en/dev/ref/models/instances/

您可以更改__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
于 2013-05-04T01:04:39.513 回答