1

私は Django に比較的慣れていないため、ドキュメントで明確でないことを達成しようとしています。私のアプリケーションには、複数のタイプのユーザーが必要です。そこで、django User を拡張し、すべての User タイプに共通する追加フ​​ィールドを含む Profile モデルを作成しました。

USER_TYPES = (
    ('A', 'UserTypeA'),
    ('B', 'UserTypeB'),
    ('C', 'UserTypeC'),
)

class Profile(models.Model):
    user = models.OneToOneField(User, unique=True)
    about = models.TextField(blank=True)
    user_type = models.CharField(max_length=3, choices=USER_TYPES, default='A')

    def save(self, *args, **kwargs):
        try:
           existing = Profile.objects.get(user=self.user)
           self.id = existing.id #force update instead of insert
        except Profile.DoesNotExist:
           print "Profile not created yet"
        models.Model.save(self, *args, **kwargs) 

def create_user(sender, instance, created, **kwargs):
    print "User Profile Creation: False"
    if created:
        print "User Profile Creation: ", created
        Profile.objects.create(user=instance)

post_save.connect(create_user, sender=Profile)

settings.py で設定しました:

AUTH_PROFILE_MODULE = 'users.Profile'

その後、次のように Profile モデルから派生した UserTypeX モデルを定義しました。

class UserTypeA(Profile):
    phone_number = models.CharField(max_length=13,blank=False)

class UserTypeB(Profile):
    company_name = models.CharField(max_length=30,blank=False)
    phone_number = models.CharField(max_length=13,blank=False)

    def __init__(self, *args, **kwargs):
        kwargs['user_type'] = 'B'
        super(UserTypeB, self).__init__(*args, **kwargs)

...

これらのユーザー モデルを管理者に登録して、ユーザーを個別に管理できるようにしました。

デフォルトの管理者の動作では、すべての Profile および UserTypeX フィールドが正しく表示され、User フィールド用の選択ボックス (横にプラス ボタンがある) があります。これは、Profile モデルと User モデル間の OneToOneField 関係によるものです。したがって、新しい UserTypeX を作成するときはいつでも、プラス ボタンを押して、新しいポップアップ ウィンドウにすべてのデフォルトの User django 定義フィールドを入力する必要があります。

私が今苦労しているのは、新しいポップアップ ウィンドウではなく、UserTypeX の追加/編集ページにインラインでこれらのユーザー フィールドを表示することです。StackedInlines と TabularInlines に関するドキュメントを読みましたが、祖先の追加/編集ページで親フィールドをインライン化したいのですが、その逆はしたくないので、それらは私のケースには合いません。

その問題のサンプル コード (お願いします!) で提案された解決策はありますか? 前もって感謝します!


簡単に言うと、管理者のプロファイルの追加/編集画面で (OneToOneField 関係による選択/追加機能の代わりに) ユーザー フィールドを表示する方法はありますか?


更新:問題に簡単に対処する関連する質問 (未回答ですが...) は次のとおりです。

Django Admin の逆インライン

4

2 に答える 2

0

これがどのように機能するかわかりません.djangoにusers.Profileプロファイルモデルとして使用するように指示しましたが、実際には子を使用したいと考えています. さらに、インラインフォームを「間違った方法で」使用したいとおっしゃっています。何を達成しようとしているのか正確にわからなくても、django admin を使用するのではなく、カスタム ビューを定義してユーザーの詳細を編集することで、インライン フォームの問題を修正できることをお勧めします。profile typeさまざまなプロファイル タイプについては、モデルでフィールドを定義し、その値に応じてさまざまなフィールド/プロパティを非表示/表示することをお勧めします。

于 2012-10-10T11:33:03.730 に答える