1

ユーザーとの Django アプリケーションがあります。Djangoが提供するデフォルトのユーザーモデルへの「教師」と呼ばれる外部キーを持つ「コース」と呼ばれるモデルがあります。

class Course(models.Model):
    ...
    teacher = models.ForeignKey(User, related_name='courses_taught')

個々のコースの情報を編集するためのモデル フォームを作成すると、教師フィールドの可能なユーザーがこの長いユーザー名の選択メニューに表示されます。

ここに画像の説明を入力

これらのユーザーは ID で並べ替えられていますが、これは私にはほとんど役に立ちません。どうやって

  1. これらのユーザーを姓で並べ替えますか?
  2. User クラスの文字列表現を「username」ではなく「Firstname Lastname (username)」に変更しますか?
4

3 に答える 3

0

概要

管理者のみを扱っている場合は、サブクラス化が将来の面倒になる可能性があるため (特に他の開発者がプロ​​ジェクトで作業する場合) 、Userモデル自体をいじるよりも、管理者のカスタマイズを使用することをお勧めします。Userオプション。

解決

管理者の問題を解決するには、ModelAdminオプションを使用できますraw_id_fields

これにより、入力がウィジェットに置き換えられます。ウィジェットをクリックすると、管理者<select>にリダイレクトされ、そこからユーザーを選択できます。User

そこから、次のUserように管理者をカスタマイズするのは簡単です。

  • 関連する順序でユーザーを表示します ( ModelAdmin.ordering)
  • 興味のある分野を表示します ( ModelAdmin.list_display)

User管理者を登録するときは、次を使用する必要があることを覚えておいてください。

admin.site.unregister(User) #This!
admin.site.register(User, MyCustomUserAdmin)

代替ソリューション

ModelAdmin.formfield_overridesまたは、より強力ですが、より複雑な をいつでも使用できます。

参照

これらの属性の使用方法の詳細については、Django のドキュメントを参照してください。

于 2012-06-02T20:09:06.873 に答える
0

フォームフィールドをカスタマイズすることでこれを実現できます。forms.ModelChoiceField

 class CustomizedModelChoiceField(forms.ModelChoiceField):
     def __init__(self, *args, **kwargs):
         # change default ordering
         super(CustomizedModelChoiceField, self).__init__(*args, **kwargs)
         self.queryset = self.queryset.order_by('last_name')

     def label_from_instance(self, obj):
         # change representation per item
         return u'{obj.first_name} {obj.last_name} ({obj.username})'.format(obj=obj)

次に、それをフォームで使用して、 default を置き換えますModelChoiceField

Django Admin では、次のようになります。

class CourseAdmin(admin.ModelAdmin):    
     def formfield_for_dbfield(self, db_field, **kwargs):
         if db_field.name == 'teacher':
             kwargs['form_class'] = CustomizedModelChoiceField
         return super(CourseAdmin, self).formfield_for_dbfield(db_field, **kwargs)
于 2012-06-03T07:01:26.313 に答える
0

まずは順番。ネストされたMetaクラスを使用して、モデルのデフォルトの順序を定義できます。注文セクションを確認してください。

第二に、表現。__str__()モデルの/__unicode__()メソッドを定義する必要があります。オブジェクトを表す文字列を返す必要があります。ドキュメントで例を見ることができます。ただし、User外部モジュールからのモデルであるため、そのようにするのは難しい場合があります。

おそらく次のことができます。

  • Userアプリの初期化中にモデル メタ クラスにモンキー パッチを適用する OR
  • モデルをサブクラス化し、サブクラスUserに追加してORMetaの代わりに使用しますUser
  • 呼び出す代わりにオブジェクト属性を使用するカスタム フィールド/フォーム テンプレートを作成します。str()

それはすべて現在のケースに依存します

于 2012-06-02T16:53:05.170 に答える