如何让 Django 管理员下拉列表只显示第一个"order by"项而不是 models.py 默认值?



我正在开发一个网站构建程序。

当用户创建一个新页面时,他必须选择一种语言(例如英语、法语、德语(。

在Django Admin中,在语言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的语言,即使它不是列表中的第一个。

Django总是预先选择语言0,用户无法通过设置语言的显示顺序来设置新页面的默认语言。

我想要Django停止选择下拉菜单中的第二项或第三项,并像正常下拉菜单一样将其默认为第一项。

我预计这个问题与在页面模型中声明默认语言为0有关,但当我删除它时,它无法工作。

我认为问题是您将orderpk合并在一起,它们都是0,但它们指的不是同一个东西,因此顺序与您预期的不同。

首先,您可以在Meta:类中设置Language模型的顺序

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管理中的字段。

使用可调用作为默认值的主要问题是,您不能向它传递任何变量,因此它使过滤变得更加困难。

如果这些不能解决您的订购问题,那么您可能需要进一步研究管理定制。

相关内容

  • 没有找到相关文章

最新更新