在django auth中重新排序用户

ban*_*ity 12 django django-admin

我有一个对内置用户模型有一个ForeignKey的模型django.contrib.auth,我对管理员中的选择框总是按用户的主键排序而感到沮丧.

我更倾向于按字母顺序按用户名排序,虽然我的本能不是想要摆弄Django的内部,但我似乎无法找到一种更简单的方法来重新排序用户.

我能想到的最简单的方法是进入我的Django安装并添加

ordering = ('username',)
Run Code Online (Sandbox Code Playgroud)

到User模型的Meta类.

有什么样的monkeypatching我可以做或任何其他侵入性较小的方式来修改用户模型的顺序?

或者,任何可以通过改变而破坏的东西都可以吗?

Jar*_*die 23

有一种方法可以使用ModelAdmin对象来指定自己的表单.通过指定自己的表单,您可以完全控制表单的组成和验证.

假设具有FK的模型UserFoo.

myapp/models.py可能看起来像这样:

from django.db import models
from django.contrib.auth.models import User

class Foo(models.Model):
    user = models.ForeignKey(User)
    some_val = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

然后,您将创建一个myapp/admin.py包含以下内容的文件:

from django.contrib.auth.models import User
from django import forms
from django.contrib import admin

class FooAdminForm(forms.ModelForm):
    user = forms.ModelChoiceField(queryset=User.objects.order_by('username'))

    class Meta:
        model = Foo

 class FooAdmin(admin.ModelAdmin):
     form = FooAdminForm

 admin.site.register(Foo, FooAdmin)
Run Code Online (Sandbox Code Playgroud)

完成此操作后,<select>下拉列表将根据用户名对用户对象进行排序.无需担心其他字段Foo......您只需要在FooAdminForm类中指定覆盖.不幸的是,您需要为每个具有FK到用户的模型提供此自定义表单定义,以便在管理站点中显示.


elo*_*0ka 14

Jarret上面的回答应该是:

from django.contrib.auth.models import User
from django.contrib import admin
from django import forms
from yourapp.models import Foo

class FooAdminForm(forms.ModelForm):
    class Meta:
        model = Foo

    def __init__(self, *args, **kwds):
        super(FooAdminForm, self).__init__(*args, **kwds)
        self.fields['user'].queryset = User.objects.order_by(...)

class FooAdmin(admin.ModelAdmin):
    # other stuff here
    form = FooAdminForm

admin.site.register(Foo, FooAdmin)
Run Code Online (Sandbox Code Playgroud)

因此,每次创建表单时都会重新评估queryset,而不是在导入包含表单的模块时重新评估一次.

  • 这看起来是一个更好的答案,它将自动创建除User字段之外所需的所有字段. (2认同)