Порядок администратора django по алфавиту - PullRequest
3 голосов
/ 17 августа 2010

Я использую django-admin, и у меня есть следующая модель. это показывает как выпадающий список в админке. как я могу заказать его по алфавиту? вместо идентификатора пользователя по умолчанию?

user= models.ForeignKey(User)

Ответы [ 5 ]

3 голосов
/ 17 августа 2010

Проблема, которую вы описываете, в соответствии с основными разработчиками Django, является функцией, а не ошибкой.Вначале Django упорядочил поле User в алфавитном порядке, но это привело к проблеме производительности для действительно больших сайтов (а именно Pownce в то время) с сотнями тысяч пользователей.Но вместо того, чтобы просить несколько огромных сайтов Django обойти эту проблему, упорядочивание было просто удалено , и теперь каждый сайт, который имеет модели с ForeignKey до User, имеетпроблема с юзабилити.

Около года назад я опубликовал некрасивое решение в системе отслеживания проблем Django.Даниэль Роузман опубликовал аналогичное (и ИМХО лучшее) решение в другом вопросе Stackoverflow .

0 голосов
/ 01 августа 2016

Если у вас есть не только 5, но и приличное количество пользователей, возможно, имеет смысл сменить администратора на использование raw_id_fields для выбора пользователя.Таким образом, пользователи будут отображаться в своем собственном представлении списка, что позволяет фильтровать и сортировать.

class MyAdmin(ModelAdmin):
    raw_id_fields = ['user']
0 голосов
/ 21 марта 2011

Почему не на уровне модели?

class Meta:
    ordering = ['field',]

Или на уровне администратора?

class Admin:
    ordering       = ('field',)
0 голосов
/ 14 марта 2011

На самом деле, Django предоставляет гораздо лучший способ сделать это. Это даже в их документации http://docs.djangoproject.com/en/1.2/topics/db/models/#proxy-models

0 голосов
/ 17 августа 2010

Создайте пользовательскую форму для вашей модели и назначьте ее своему подклассу ModelAdmin - вы можете переопределить порядок для ModelChoiceField в форме __init__. Например:

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

class MyModel(models.Model):
    user = models.ForeignKey(User)
    # Other model fields ...

# forms.py
from django import forms
from django.contrib.auth.models import User
from myapp.models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.order_by('first_name', 'last_name')

# admin.py
from django.contrib import admin
from myapp.models import MyModel
from myapp.forms import MyModelForm

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
    # Other admin attributes ...

admin.site.register(MyModel, MyModelForm)
...