我正在创建模型,其中每个模型都应与用户相关,如下所示:
class Item(models.Model):
user = models.ForeignKey(User)
但是在 Django Admin 中,对于一个Item
,它会显示一个select
字段,其中包含按用户名列出的所有用户。除了他们的用户名,我还需要显示每个用户的first_name
和last_name
.
如何在 Django 管理界面的选择列表中一起显示所有三个字段?
我正在创建模型,其中每个模型都应与用户相关,如下所示:
class Item(models.Model):
user = models.ForeignKey(User)
但是在 Django Admin 中,对于一个Item
,它会显示一个select
字段,其中包含按用户名列出的所有用户。除了他们的用户名,我还需要显示每个用户的first_name
和last_name
.
如何在 Django 管理界面的选择列表中一起显示所有三个字段?
您需要为此创建自定义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
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