Подтвердить что ты не робот

Raw_id_fields: как показать имя вместо id?

Настраивая панель администратора Django, я использую raw_id_fields чтобы выбрать ForeignKey из модели, которая имеет тысячи элементов, потому что выпадающий список выбора по умолчанию неудобен для такого количества элементов.

Это работает, но показывает идентификатор, который можно увидеть на этом изображении: enter image description here

Есть ли способ показать имя или другое поле вместо идентификатора? Или есть ли лучший способ сделать это, чем с помощью raw_id_fields?

Это мой код в models.py:

class Structure(MPTTModel):
    name = models.CharField(max_length=200, unique=True, verbose_name = _('name'))
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', verbose_name = _('parent'))

    def __unicode__(self):
        return u"%s" % (self.name)

В admin.py:

class StructureAdmin(tree_editor.TreeEditor):
    search_fields = ('name',)
    raw_id_fields = ('parent',)
4b9b3361

Ответ 1

Я также исследовал это, и я не думаю, что это возможно. Я думаю, что лучшее, что вы можете сделать, это отобразить юникод поля рядом с необработанным полем id: http://djangosnippets.org/snippets/2108/

Кроме того, вы можете отобразить Юникод и ссылку на значение, соответствующее странице изменения администратора: http://djangosnippets.org/snippets/2217/

Ответ 2

Кажется, этот плагин: https://github.com/lincolnloop/django-salmonella

делает то, что вы хотите:

(скопирован из документа):

Использование

Для начала использования django-salmonella в вашем приложении все, что вам нужно сделать, это реализовать SalmonellaMixin в вашем классе ModelAdmin и добавить нужные поля в список сальмонелл-полей:

from salmonella.admin import SalmonellaMixin

class UserProfileAdmin(SalmonellaMixin, admin.ModelAdmin):
    salmonella_fields = ('user',)

Вы также можете использовать виджеты Salmonella в фильтре администратора:

from salmonella.admin import SalmonellaMixin
from salmonella.filters import SalmonellaFilter

class UserProfileAdmin(SalmonellaMixin, admin.ModelAdmin):
   list_filter = (
       ('salmonella_fk', SalmonellaFilter),
   )

Ответ 3

Для представления объекта используйте __unicode__

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

В Python 3 используйте

def __str__(self):