2012-01-07 8 views
5

私はプレイリストとそのアイテムを取得するためにモデルフォームを使用しています。また、ログインスクリプトも含まれています。現在ログインしているユーザーをユーザーモデルに設定しようとしています。modelformsのvalueError

def playlistview(request): 
    if request.method == 'POST': 
     form = playlistform(request.POST) 
     if form.is_valid(): 
       data = form.save(commit=False) 
       data.user = request.user 
       data.save() 
       return render_to_response('playlist.html', {'data': data}) 
    else: 
     form = playlistform() 
     return render_to_response('playlist.html', {'form': form, 'user': request.user}, context_instance=RequestContext(request)) 

Playlist.htmlファイル:

https://gist.github.com/1576136

エラーページ:あなたは私がここで How to avoid this dropdown combo box?

class playlistmodel(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.title 

class itemsmodel(models.Model): 
    playlist = models.ForeignKey(playlistmodel) 
    item = models.TextField() 

    def __unicode(self): 
     return self.item 

class playlistform(ModelForm): 
    class Meta: 
     model = playlistmodel 
     exclude = {'user'} 

class itemsform(ModelForm): 
    class Meta: 
     model = itemsmodel 
     exclude = {'playlist'} 

前に掲載しました。この事は、プレイリストビューがある見ることができます

https://gist.github.com/1576186

しかし、私はValueErrorを取得しています:

Exception Type: ValueError Exception Value: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x7f0234028f50>": "playlistmodel.user" must be a "User" instance 

Traceback: Local vars --- data.user = request.user 

はここhttps://gist.github.com/1575856

ありがとう私のsettings.pyです。

+1

あなたの 'settings.py' –

+0

にデフォルトの[TEMPLATE_CONTEXT_PROCESSORS](https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors)があることを確認してくださいあなたはDjangoのバージョンを使用していますか? 'データを試してください。代わりにuser_id = request.user.id' – Alasdair

+0

@César私は質問セクションにsettings.pyのリンクを掲載しました。 – rnk

答えて

0

伝えることは難しいが、私はあなたのplaylistviewでこれをしようとするだろう:

form = playlistform(request, request.POST, instance=playlistmodel) 

既存のオブジェクトを変更する場合にのみ必要になりますので、多分あなたは、最後のパラメータ(インスタンス= playlistmodel)をOMMITすることができますこのことができます

希望...

+0

上記の構文がうまくいかないようです。属性エラーを示しています。ありがとうございました。 – rnk

+0

悲しいことに、(私が知ることができるのは、この構文が似たような状況で私のために働くということです。 – Jingo

0

は、私は非常に同じ問題を抱えているが、どのユーザーが(AnonymousUserインスタンスを期待して)ログインしていないときにのみ発生します。少なくとも私のスーパーユーザーがログインしても、問題は見つけられませんでした。

私はまだ解決策を見つけていないにも関わらず、多分あなたはさて、今私は私の場合にはAnonymousUserは、DB内のNULLとして格納されなければならないことに気づいたが、残してきたこのanswer

で手がかりを見つけることができますこの答えはヒントリンクを投稿する(まだコメントを残すためのパーミッションはない)。

希望すると助かります!

5

私はこの記事が古いと知っていますが、誰かが同じ問題を抱えている場合は、request.userは実際にはdjangoのauth.userのラッパーです。 だからrequest.userSimpleLazyObjectであり、その目的は不必要なインスタンス化を避け、単純なユーザーキャッシングメカニズムを実装することです。 (最初の時間にアクセスするとき、それをインスタンス化し、) は、実際のユーザーにアクセスするには、実行する必要があります。

auth.get_user(request)

これはあなたのauth.userのインスタンスを提供します。 詳細については、this postを参照してください。