2017-01-09 6 views
0

ForeignKeyリレーションシップ、Profileモデル、Articleモデルの2つのモデルがあります。Articleオブジェクトを作成すると、接続したユーザーをprofile.userという名前で保存します。ここで フォームを外部キーのオブジェクトとして保存

は、私は以下のコードで取得エラーです:

'NoneType' オブジェクトには、属性 'ユーザー'

models.pyありません:

class Profile(models.Model): 
    name = models.CharField(max_length=120) 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, blank=True) 

class Gig(models.Model): 
    profile = models.ForeignKey(Profile, null=True) 
    title = models.CharField(max_length=100, unique=True) 

をここに私のの表示私は保存したい場所ですprofile.user

if request.method == 'POST': 
    form = GigForm(request.POST, request.FILES) 

    if form.is_valid(): 
     save_it = form.save() 
     save_it.profile.user = request.user #error occured here. 
     save_it.save() 
     return redirect(reverse('own_gigs_details')) 
else: 
    form = GigForm() 

Forms.py

class GigForm(forms.ModelForm): 
    class Meta: 
     model = Gig 
     fields = ['title', 'image', 'body', 'price'] 

私が間違って何をしているのですか?

+0

あなたは 'GigForm'を表示できますか? –

+0

@AndreyShipilov私はGigFormとは関係がないと思っていますが、私はそれを更新しました – Lindow

+0

私が見る限り、あなたはFKである 'profile'を作成していないので、それはただのものです。 –

答えて

1

フォームを保存して最初にGigを作成すると、そのフォームにリンクされているプロファイルはありません(フォームに宣言されていないため)。したがって、save_it.profileに値がないため、エラーが発生します。

私はあなたがログインしているユーザーのプロファイルへのギグをリンクしようとしていると思います。これを行うには、私はあなたの代わりにユーザー自身を割り当てるので

save_it.profile = request.user.profile 
save_it.save() 

を行うことができると思います。

OneToOneFieldを使用すると、オブジェクトを両方向で参照できます。したがって、user.profileとprofile.userを実行できます。

+0

ForeignKeyでもうまく動作し、試してみました。 – Lindow

+1

私は最後の文で私がはっきりしていなかったと思います。 1つのプロファイルに関連して多くのGigインスタンスが存在する可能性があるので、ForeignKeyは間違いなく、Gigをプロファイルに関連付ける場合の最善の策です。しかし、ユーザーとプロファイルを扱う場合、これは1対1のマッピングであり、OneToOneFieldを使用した理由です。それはあなたが他のものからそれぞれを参照できることを意味する...幸運を! – zubhav

+0

今、意味が分かります – Lindow

関連する問題