21

Django を使用して組み込みの DjangoモデルUserProfileを拡張するアプリケーションがあります。User少し似ています:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    # Local Stuff
    image_url_s = models.CharField(max_length=128, blank=True)
    image_url_m = models.CharField(max_length=128, blank=True)

    # Admin
    class Admin: pass

モデルに新しいクラスを追加しました。

class Team(models.Model):
    name = models.CharField(max_length=128)
    manager = models.ForeignKey(User, related_name='manager')
    members = models.ManyToManyField(User, blank=True)

そして、それは管理者に登録されています:

class TeamAdmin(admin.ModelAdmin):
    list_display = ('name', 'manager')

admin.site.register(Team, TeamAdmin)

残念ながら、管理者インターフェースで、ドロップダウン ボックスからマネージャーを選択したり、複数選択フィールドを介してチーム メンバーを設定したりすると、ユーザーの数値 ID によって並べ替えられます。私の人生では、これらを整理する方法がわかりません。

私は同様のクラスを持っています:

class Meta:
    ordering = ['name']

それはうまくいきます!Userしかし、私はクラスを「所有」しておらず、このトリックを で試すとUserAdmin:

class Meta:
    ordering = ['username']

私は得る:

django.core.management.base.CommandError: One or more models did not validate: events.userprofile: "ordering" refers to "username", a field that doesn't exist.

user.usernameどちらも機能しません。したい場合のように、指定できますimage_url_s。. . ユーザーのリストを で並べ替えるように管理者に指示するにはどうすればよいusernameですか? ありがとう!

4

4 に答える 4

37

これ

class Meta:
    ordering = ['username']

する必要があります

    ordering = ['user__username']

UserProfile 管理クラスにある場合。これで例外は停止しますが、役に立たないと思います。

あなたが説明したように User モデルを注文するのは非常に難しいですが、解決策についてはhttp://code.djangoproject.com/ticket/6089#comment:8を参照してください。

于 2009-09-24T21:15:58.617 に答える
29

1 つの方法は、管理者でチーム モデルに使用するカスタム フォームを定義managerし、正しい順序でクエリセットを使用するようにフィールドをオーバーライドすることです。

from django import forms

class TeamForm(forms.ModelForm):
    manager = forms.ModelChoiceField(queryset=User.objects.order_by('username'))

    class Meta:
        model = Team

class TeamAdmin(admin.ModelAdmin):
    list_display = ('name', 'manager')
    form = TeamForm
于 2009-09-24T21:10:23.990 に答える
3

これは何らかの理由で危険な場合がありますが、プロジェクトのmodels.pyファイルの 1 行で実行できます。

User._meta.ordering=["username"]
于 2011-11-11T18:54:28.200 に答える
1

私にとって、唯一の有効な解決策はProxy Modelを使用することでした。ドキュメントに記載されているように、組み込みモデルに対しても独自のプロキシ モデルを作成し、通常のモデルのようにカスタマイズできます。

class OrderedUser(User):
    class Meta:
        proxy = True
        ordering = ["username"]
    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

その後、モデルで外部キーを次のように変更します。

user = models.OneToOneField(OrderedUser, unique=True)

またはさらに適した

user = models.OneToOneField(OrderedUser, unique = True, parent_link = True)
于 2014-05-14T08:52:46.480 に答える