【问题标题】:django admin order by alphabetdjango admin 按字母顺序排列
【发布时间】:2010-08-16 20:33:24
【问题描述】:

我正在使用 django-admin,我有一个模型如下。它在管理员中显示为下拉列表。我怎样才能按字母排序?而不是默认用户 ID?

user= models.ForeignKey(User)

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    根据 Django 核心开发人员的说法,您描述的问题是一个功能,而不是一个错误。一开始,Django 按字母顺序对User 字段进行排序,但这导致了真正 拥有数十万用户的大型网站(当时是Pownce)的性能问题。但是,与其要求少数巨大 Django 网站实施变通办法,不如简单地订购removed,现在每个具有ForeignKeyUser 的模型的网站都存在可用性问题。

    大约一年前,我在 Django 问题跟踪器上发布了ugly workaround。 Daniel Roseman 在另一个 Stackoverflow question 中发布了一个类似(恕我直言更好)的解决方案。

    【讨论】:

    • 你知道类型对象'CollaboratorForm'没有属性'fields'
    【解决方案2】:

    为什么不在关卡模型上?

    class Meta:
        ordering = ['field',]
    

    还是管理员级别的?

    class Admin:
        ordering       = ('field',)
    

    【讨论】:

    • 只是因为它是django.contrib,所以你不应该这样改变它。你可以,但是这不是为单个项目修改库的好主意。
    • 对不起?我不是在谈论修改任何库。我正在考虑文档中所述的代理模型:“标准用户模型没有定义排序(故意;排序很昂贵,我们不想在获取用户时一直这样做)。你当您使用代理时,可能希望按用户名属性定期排序..."
    • 但是 - 你将在不同的命名空间中有不同的模型。因此,您的外键将指向不同的模型。
    • 是的,代理模型。够清楚了吧?无论如何,与您的第一条评论无关,
    【解决方案3】:

    为您的模型创建一个自定义表单并将其分配给您的 ModelAdmin 子类——您可以在表单的 __init__ 中覆盖 ModelChoiceField 的排序。例如:

    # models.py
    from django.db import models
    from django.contrib.auth.models import User
    
    class MyModel(models.Model):
        user = models.ForeignKey(User)
        # Other model fields ...
    
    # forms.py
    from django import forms
    from django.contrib.auth.models import User
    from myapp.models import MyModel
    
    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
    
        def __init__(self, *args, **kwargs):
            super(MyModelForm, self).__init__(*args, **kwargs)
            self.fields['user'].queryset = User.objects.order_by('first_name', 'last_name')
    
    # admin.py
    from django.contrib import admin
    from myapp.models import MyModel
    from myapp.forms import MyModelForm
    
    class MyModelAdmin(admin.ModelAdmin):
        form = MyModelForm
        # Other admin attributes ...
    
    admin.site.register(MyModel, MyModelForm)
    

    【讨论】:

    • 你知道为什么我总是得到“类型对象'CollaboratorForm'没有属性'字段'”谢谢
    【解决方案4】:

    实际上,Django 提供了更好的方法来做到这一点。甚至在他们的文档中 http://docs.djangoproject.com/en/1.2/topics/db/models/#proxy-models

    【讨论】:

      【解决方案5】:

      如果您不仅拥有 5 个用户,而且拥有相当数量的用户,则将管理员更改为使用 raw_id_fields 进行用户选择可能是有意义的。这样,用户将显示在他们自己的列表视图中,允许过滤和排序。

      class MyAdmin(ModelAdmin):
          raw_id_fields = ['user']
      

      【讨论】:

        【解决方案6】:

        您可以轻松地在您的admin.py 相关管理类中排序。

        假设您的 Admin 类如下:

        @admin.register(UserStuff)
        class UserStuffAdmin(admin.ModelAdmin):
            list_display = ['user', 'other', 'fields']
            ordering = ['user']
        

        ordering = ['user'] 行将按user 字段排序。按字母顺序或数字顺序,具体取决于字段。使用字段的正常排序方法。您也可以使用ordering = ['-user'],它会按降序排列。

        来源: https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.ordering

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-15
          • 1970-01-01
          • 2020-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多