Как заставить выпадающий список Django Admin показывать только первый элемент "order by", а не по умолчанию models.py?

Я работаю над программой для создания сайтов.

Когда пользователь создает новую страницу, он должен выбрать язык (например, английский, французский, немецкий).

В Django Admin, в языковой админке, пользователь может установить порядок. Модель языка содержит:

order = models.PositiveSmallIntegerField(default=0, verbose_name='display order')

В параметрах страницы в Django Admin пользователь должен выбрать язык. Модель страницы содержит:

language = models.ForeignKey(Language, default=0, on_delete=models.PROTECT, verbose_name='language')

Проблема, с которой я столкнулся, заключается в том, что когда пользователь создает новую страницу в Django Admin, язык с PK 0 всегда выбирается по умолчанию, даже если он не первый в списке.

Язык 0 всегда предварительно выбирается Django, и пользователь не может установить язык по умолчанию для новых страниц, задав порядок отображения языков.

Я хочу, чтобы Django останавливал выбор 2-го или 3-го элемента в выпадающем списке и переходил к первому элементу как в обычном выпадающем списке.

Я предполагаю, что проблема связана с объявлением того, что язык по умолчанию равен 0 в модели page model, но я не смог заставить его работать, когда удалил его.

Я думаю, проблема в том, что вы смешиваете order и pk, которые оба являются 0, но они не относятся к одной и той же вещи - следовательно, порядок не такой, как вы ожидаете.

Во-первых, вы можете установить порядок ваших Language моделей в классе Meta:

class Language(models.Model):
   ...
   class Meta:
      ordering = ('order',)

Во-вторых, вы можете установить значение по умолчанию как вызываемое поле языка, которое всегда получает первое значение:

def get_default_language():
   return Language.objects.first()

...

language = models.ForeignKey(Language, ..., default=get_default_language)

Это должно предварительно заполнить поле в админке Django возвращаемым значением.

Основная проблема с использованием callable по умолчанию заключается в том, что вы не можете передать ему никаких переменных, так что это значительно усложняет фильтрацию.

Если это не исправит ваш заказ, то вам, возможно, придется углубиться в настройку администратора.

Вернуться на верх