我正在尝试构建应用,其中每个项目都应与某些用户相关联。 将它们放在一起很容易
user = models.ForeignKey(User)
不幸的是,在django admin的情况下,我得到选择字段,其中所有用户都按其用户名列出。另外我需要他们的first_name和last_name。 我只是想不通,如果有任何方法在django管理界面的选择列表中显示所有名称。
答案 0 :(得分:15)
您需要为此创建自定义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 :(得分:2)
Django在许多地方使用unicode(obj)(或相关函数str(obj))。最值得注意的是,在Django管理站点中显示一个对象,并在显示一个对象时将值插入到模板中。
请参阅https://docs.djangoproject.com/en/dev/ref/models/instances/
中的__unicode__
您可以更改User类的__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