Заменить пользователей в django auth
У меня есть модель, которая имеет ExternalKey для встроенной модели пользователя в django.contrib.auth
, и я расстроен тем фактом, что поле выбора в admin всегда сортируется по первичному ключу пользователя.
Я бы предпочел, чтобы это сортировалось по имени пользователя по алфавиту, и хотя мой инстинкт не хотел возиться с внутренностями Django, я не могу найти более простой способ изменить порядок пользователей.
Самый простой способ, о котором я могу думать, - это окунуться в мою установку Django и добавить
ordering = ('username',)
для класса Meta модели пользователя.
Есть ли какой-то monkeypatching, который я мог бы сделать, или любой другой менее инвазивный способ изменить порядок модели пользователя?
В качестве альтернативы, может ли кто-нибудь что-нибудь, что может сломаться, сделав это изменение?
Ответы
Ответ 1
Существует способ использовать объекты 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 для пользователя, который вы хотите представить на сайте администратора.
Ответ 2
Ответ 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)
поэтому запрос будет повторно оцениваться каждый раз, когда вы создаете форму, а не один раз, когда импортируется модуль, содержащий форму.