2016-09-24 8 views
0

ユーザーモデルの拡張に関するチュートリアルを行っていますが、動作するようですが、プロパティの呼び出し方法とコンストラクタに関する2つの質問がありました。まず、これはメインモデルは、ユーザに提示されます。このモデルのこのプロパティを呼び出す方法を理解できません

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    likes_cheese = models.BooleanField(default=True) 
    puppy_name = models.CharField(max_length=20) 

User.profile = property(lambda u : UserProfile.objects.get_or_create(user=u)[0])--->Statement A 

今の形がある

問題のコードは、この

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('likes_cheese','puppy_name') 

とこのフォームはようで提示ビューですこれは私の質問がここにあります(ここで私は単純にフォームを提示することに興味があり、他のコードを削除しました)。

def user_profile(request): 
    display_page = "profile.html" 
    csrf_token = csrf(request) 
    args={} 
    user = request.user 
    profile = user.profile ---------------------->statement B - Question 1 below 
    form = UserProfileForm(instance=profile) ------->statement C - Question 2 below 
    args.update(csrf_token) 
    args["form"] = form 
    return render_to_response(display_page,args) 
今ここ

は私の二つの質問

Q1-ありえないパラメータはUserオブジェクトのプロパティprofileに渡されるのはなぜですか?

私が理解から声明から

User.profile = property(lambda u : UserProfile.objects.get_or_create(user=u)[0]) 

あるプロファイルは、ユーザーのプロパティとして定義され、それがパラメータを受け取るラムダであるセッター機能を持っていることをされていることです。そのパラメータはどこに渡されますか?私が見るすべては、この

 profile = user.profile 
     form = UserProfileForm(instance=profile) 

Q2は-でコードform = UserProfileForm(instance=profile)我々は、パラメータとしてインスタンスを渡している(プロパティへのパラメータは、私が見ることができる場所であればどこでも渡されていません)ですが、私のUserProfileFormはありません。コンストラクタ?ここで何が起きてるの。

事前に感謝

答えて

2

Q1:あなたはDjangoの定義済みのUserクラスを使用しているため、新しいプロパティを追加するには、2つのオプションがあります(Userモデルを継承し、ちょうど新しいプロパティを追加するためにそれを使用するジャンゴを避ける)、またはあなたのようにしてください。

lambdaUserProfile.objects.get_or_create(user=user)[0]

Q2ないようにあなたは、あなたがすでにパラメータとしてuserを渡しuser.profile呼び出す:すでにコンストラクタを持っていforms.ModelFormからあなたのUserProfileForm継承を。また、instance引数を渡すことができます。そのため、フォームにモデルデータ()が入力されます。同じ瞬間に

django.forms.ModelForm

django.forms.models.BaseModelFormから継承し __init__で、それは私は2あなたは1を説明することができなかった理解

if instance is None: 
    # if we didn't get an instance, instantiate a new one 
    self.instance = opts.model() 
    object_data = {} 
+0

sourceから、instanceキーワード引数が与えているかどうかを確認すると、次のようにフォームを移入し、私はまだ理解しません値がパラメータとしてプロパティに渡されています –

+0

@JamesFranco私は答えを更新しました。 –

関連する問題