Подтвердить что ты не робот

Заменить пользователей в django auth

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

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

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

ordering = ('username',)

для класса Meta модели пользователя.

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

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

4b9b3361

Ответ 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)

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