管理界面中的外键和选择字段值

时间:2013-05-04 00:32:09

标签: django django-admin

我正在尝试构建应用,其中每个项目都应与某些用户相关联。 将它们放在一起很容易

user = models.ForeignKey(User)

不幸的是,在django admin的情况下,我得到选择字段,其中所有用户都按其用户名列出。另外我需要他们的first_name和last_name。 我只是想不通,如果有任何方法在django管理界面的选择列表中显示所有名称。

2 个答案:

答案 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. 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

答案 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