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',)
Ответы
Ответ 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):
Ответ 4
В django2.1
вы можете использовать autocomplete_fields
. Это будет работать так же, как ajax select2.
В admin.py
class StructureAdmin(tree_editor.TreeEditor):
search_fields = ('name',)
autocomplete_fields = ('parent',)
Ссылка: https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.autocomplete_fields