Django ModelAdmin和Dropdown值

时间:2013-12-28 02:00:04

标签: django django-models django-admin

在app / models.py中

class Template(models.Model):
    user = models.ForeignKey(User);
app / admin.py中的

class TemplateAdmin(admin.ModelAdmin):
     list_display = ('user', 'status',);

当我在Site Adminitration中编辑模板表时,我会看到用户字段的下拉列表。下拉列表中的值为“username”,但app_templates将用户值存储为“user_id”。

如何使站点管理中的下拉列表显示first_name,last_name,email而不是'username'的组合?但是,'templates'表会将值存储为'id'?

谢谢!

2 个答案:

答案 0 :(得分:1)

来自Django Docs:

  

模型的 unicode str )方法将是   调用以生成要使用的对象的字符串表示   该领域的选择;提供自定义表示,子类   ModelChoiceField并覆盖label_from_instance。这种方法会   接收一个模型对象,并返回一个适合的字符串   代表它。

https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

所以要覆盖它:

class UserChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return '%s - %s - %s' % (obj.first_name, obj.last_name, obj.email)

class TemplateAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(TemplateAdminForm, self).__init__(*args, **kwargs)
        self.fields['user'] = UserChoiceField(queryset=User.objects.all())

class TemplateAdmin(admin.ModelAdmin):
    form = TemplateAdminForm

答案 1 :(得分:0)

将'user'更改为:

list_display = ('full_username')

将以下内容添加到类Template:

def full_username(self):
    return str(self.user.first_name) + ' ' + str(self.user.last_name) + ' ' + str(self.user.email);