在Django认证中重新排列用户

12

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

我更希望按字母顺序按用户名排序,虽然本能告诉我不要去改变Django的核心代码,但我似乎找不到更简单的重新排序用户的方法。

我能想到最直接的方法是深入我的Django安装并添加:

ordering = ('username',)

要修改User模型的顺序,我能否进行某种猴子补丁或任何其他不太侵入性的修改方式?

或者,有人能想到由于进行此更改可能会出现什么问题吗?

建议:将此更改添加到User模型的元类中。

2个回答

23

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

假设您的模型具有到User的FK,名称为Foo

您的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()

然后您需要创建一个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)

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


排序功能很好,但现在这些字段变成了必填项。我该如何保持它们为可选项? - thumbtackthief

15

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)

所以每次创建表单时,查询集都会重新评估,而不是在导入包含表单的模块时仅评估一次。


2
这似乎是一个更好的答案,它将自动创建除了用户字段之外的所有必需字段。 - Tom Leys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接