【问题标题】:Django ModelAdmin - custom name of items in drop down listDjango ModelAdmin - 下拉列表中项目的自定义名称
【发布时间】:2018-04-18 14:28:20
【问题描述】:

我想在 Django 管理模型的下拉列表中更改项目(用户)的名称。我想在不改变基本模型的情况下做到这一点。

我只想通过用户名(只是没有名字和姓氏)在Worker模型(office.py)中字段'user'(admin.py)引用'user'

admin.py

from .models import Token

class TokenAdmin(admin.ModelAdmin):
    model = Token

    fieldsets = (
        (None, {
            'fields': ('name', 'key', 'user')
        }),

models.py

from office.models import Worker

class Token(models.Model):
    user = models.ForeignKey(
            Worker,
            related_name='auth_token',
            verbose_name=_("api.models.token.user")
        )

office.py

class Worker(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name=_("User"))
    firstname = models.CharField(
        _("Firstname"), blank=False, null=False, max_length=50)
    lastname = models.CharField(
        _("Lastname"), blank=False, null=False, max_length=50)

    def __str__(self):
        return "%s %s" % (self.lastname, self.firstname)

【问题讨论】:

  • 可以改成Worker.__str__方法返回self.user.username
  • 我说过,我不想改变模型中的任何想法,因为它会影响代码的另一部分。

标签: django django-models foreign-keys django-admin django-modeladmin


【解决方案1】:

我已经解决了!

admin.py

class UserChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.user

class TokenAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == 'user':
            kwargs['form_class'] = UserChoiceField
        return super(TokenAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多