Изменение порядка пользователей в Django Auth - PullRequest
12 голосов
/ 29 мая 2009

У меня есть модель, которая имеет ForeignKey для встроенной пользовательской модели в django.contrib.auth, и я разочарован тем, что поле выбора в админке всегда сортирует по первичному ключу пользователя.

Я бы предпочел, чтобы он сортировался по имени пользователя в алфавитном порядке, и хотя я инстинктивно не хочу возиться с внутренностями Джанго, я не могу найти более простой способ изменить порядок пользователей.

Самый простой способ, который я могу придумать, это окунуться в мою установку Django и добавить

ordering = ('username',)

в мета-класс модели User.

Есть ли какой-нибудь способ обезьяны, который я мог бы сделать, или любой другой, менее инвазивный способ изменить порядок модели User?

В качестве альтернативы, может ли кто-нибудь что-нибудь сломать, сделав это изменение?

Ответы [ 2 ]

23 голосов
/ 29 мая 2009

Существует способ использования объектов ModelAdmin для указания собственной формы. Указав собственную форму, вы полностью контролируете ее состав и проверку.

Скажите, что модель с FK на User равна 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 для пользователя, которую вы хотите представить на сайте администратора.

14 голосов
/ 21 июля 2009

Ответ Джарре выше должен выглядеть следующим образом:

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)

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

...