2010-08-16 63 views
3

我正在使用django-admin,我有一個模型如下。它顯示爲管理員中的下拉列表。我怎樣才能按字母順序排列呢?而不是默認的用戶ID?django管理員按字母順序排列

user= models.ForeignKey(User) 

回答

3

根據Django核心開發人員的說法,您所描述的問題是一個功能,而不是一個錯誤。在開始時,Django按字母順序排列User字段,但這導致真的大型網站(即當時的Pownce)的性能問題,成千上萬的用戶。但是,不要問幾個巨大的 Django網站實施一個解決方法,排序只是removed,現在每個網站的模型與ForeignKeyUser有可用性的問題。

大約一年前,我在Django問題跟蹤器上發佈了ugly workaround。 Daniel Roseman在另一個Stackoverflow question中發佈了類似的(和更好的)更好的解決方案。

+0

做你知道類型的對象「CollaboratorForm」有沒有屬性「域」 – Grey 2010-08-17 21:13:23

+0

感謝我得到了它,我不應該使用註冊 – Grey 2010-08-17 21:41:26

0

爲您的模型創建一個自定義表單並將其分配給您的ModelAdmin子類 - 您可以覆蓋表單的__init__中ModelChoiceField的排序。例如:

# 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) 
+0

做你知道爲什麼我總是得到「對象類型‘CollaboratorForm’有沒有屬性‘域’ 「 謝謝 – Grey 2010-08-17 21:12:37

+0

謝謝,我明白了,我不應該使用寄存器 – Grey 2010-08-17 21:42:30

0

爲什麼不在級別模型?

class Meta: 
    ordering = ['field',] 

或者在管理員級別?

class Admin: 
    ordering  = ('field',) 
+0

只是因爲它是django.contrib,所以你不應該這樣改變它。你可以但是這不是一個好主意來修改單個項目的庫。 – Jerzyk 2011-03-22 12:10:31

+0

對不起?我不是在談論修改任何圖書館。正如文檔中所述,我正在考慮使用代理模型:「標準的用戶模型沒有定義它的排序(故意;排序是昂貴的,我們不想在我們獲取用戶時一直這樣做)。當你使用代理時,可能希望通過用戶名屬性進行定期...「 – inigomedina 2011-03-23 15:26:12

+0

但是,然後 - 你將在不同的命名空間中使用不同的模型。所以你的外鍵將是一個不同的模型。 – Jerzyk 2011-03-23 15:52:42

0

如果你不僅5,但用戶的像樣的數目,它可能是有意義的更改管理員使用raw_id_fields用戶選擇。這樣,用戶將顯示在他們自己的列表視圖中,允許過濾和排序。

class MyAdmin(ModelAdmin): 
    raw_id_fields = ['user']