2009-05-28 13 views
12

組み込みユーザーモデルのForeignKeyがdjango.contrib.authというモデルがあります。管理者の選択ボックスは、ユーザーの主キーによって常にソートされるという事実に不満を持っています。django authのユーザーを並べ替え

アルファベット順にユーザー名でソートしておく方がいいですし、Djangoの居場所を知りたくないのは私の本能ですが、ユーザーを並べ替えるのが簡単ではないようです。

私は考えることができる最も簡単な方法は、インストールして、Userモデルのメタクラスに

ordering = ('username',) 

を追加私のジャンゴに浸すことであろう。

ユーザーモデルの順序を変更するために、私が行うことができる何らかの種類のモノスケッチや他の侵略的でない方法がありますか?

また、この変更を行うことで壊れる可能性のあるものはありますか?

答えて

23

ModelAdmin objectsを使用して独自のフォームを指定する方法があります。独自のフォームを指定することにより、フォームの構成と検証を完全に制御できます。

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 to Userを持つすべてのモデルに対して、このカスタムフォーム定義を提供する必要があります。上記

+0

これは私のためにうまくいった – Rasiel

+0

注文は素晴らしいですが、今ではそれらのフィールドが必要に応じて登場しています。どうしたらいいですか? – thumbtackthief

14

ジャレットの答えは実際に読んでください:フォームを含むモジュールがインポートされたときに、1回に対立するものとして

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) 

がそうクエリセットは、フォームを作成するたびに再評価されます。

+2

これははるかに良い答えのように見えますが、これは自動的にUserフィールドだけで必要なフィールドをすべて作成します。 –

関連する問題