3

User モデルにフィールドを追加して、それらを管理ページに追加しようとしています。ここのdjangoドキュメントには推奨される方法があります:

https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

そこで、新しいモデル用に OneToOne フィールドを作成しました。

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    designs = models.ManyToManyField('Design', blank=True)
    prints = models.ManyToManyField('Print', blank=True)
    rating = models.IntegerField(null=True, blank=True)
    reliability = models.IntegerField(null=True, blank=True)
    av_lead_time = models.IntegerField(null=True, blank=True)

settings.py に AUTH_PROFILE_MODULE を追加しました。

AUTH_PROFILE_MODULE = 'website.UserProfile'

UserProfile フィールドを管理ページに追加しようとしました:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from website.models import UserProfile
from django.contrib.auth.models import User

# Define an inline admin descriptor for UserProfile model
# which acts a bit like a singleton
class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'profile'

# Define a new User admin
class UserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

ここで、管理者メニューから登録済みユーザーにアクセスしようとすると、次のようになります。

Caught DoesNotExist while rendering: User matching query does not exist.
In template /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
19            {{ field.field }}

管理メニューから新しいユーザーを追加しようとすると、次のようになります。

Caught DoesNotExist while rendering: User matching query does not exist.
In template /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
19            {{ field.field }}

その特定のフィールドを認識しないのはなぜですか?

4

3 に答える 3

2

編集:完全なエラー メッセージを確認した後、エラーが User の拡張だけに関連しているわけではないことがわかります。このエラーは、編集/追加している UserProfile にプリントを割り当てるために使用されるチェックボックスと対応するラベルをレンダリングするときに発生します。Django 管理者は、各 Print インスタンスのラベルをレンダリングするために Print.__unicode__ を呼び出しています。これは、(/threedee/website/models.py の 33 行目で) User への外部キーである Print の "printer" 属性にアクセスします。何らかの理由で、Prints の 1 つに無効なプリンター値があり、ユーザーを指していません。

ここで実際に何が起こっているのかは、Print モデルを見ないとわかりません。Print データベース テーブル (website_print という名前にする必要があります) をチェックして、異常がないかどうかを確認することをお勧めします (PostgreSQL を使用していますか?)。そこに重要なデータがない場合は、Print テーブル全体を切り捨てるとうまくいくはずです。

これはあなたがまだ従うべき私の古い答えですが、あなたが経験しているエラーとは関係ありません:

他の回答にコメントするだけですが、私にはそれを行う方法がないようです。Alexey Sidorov と Like it's の両方の回答を組み合わせる必要があります。

最初に django シェルを使用して、既存のユーザーの UserProfile インスタンスを作成します。Like it's answerがシェル (python manage.py shell) で提供するコマンドを実行するだけです。

その後、alexey-sidorov からの回答に従って、新しいユーザーごとに UserProfile を自動的に作成するシグナルをセットアップする必要があります。

于 2012-10-19T11:37:29.017 に答える
1

これを models.py の UserProfile クラスの後に追加します。

      from django.db.models.signals import post_save  
      def create_user_profile(sender, instance, created, **kwargs):
          if created:
              UserProfile.objects.create(user=instance)

      post_save.connect(create_user_profile, sender=User)

詳細https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

于 2012-10-19T10:01:00.510 に答える
1

既存のユーザーの UserProfile エントリを追加します。

from django.contrib.auth.models import User
from website.models import UserProfile
for user in User.objects.all():
    profile = UserProfile.objects.get_or_create(user = user)

新しいユーザーのプロファイルも作成します。何のために信号を使用します。

于 2012-10-19T10:33:02.393 に答える