0

次のようにコメントフォームを作成しようとしています。

class CommentCreationForm(forms.Form):
    body = forms.CharField(widget=forms.Textarea)
    author = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(CommmentCreationForm, self).__init__(*args, **kwargs)
        self.user = kwargs.pop('user', None)

    def save(self):
        data = self.cleaned_data
        comment = Comment(body=data['body'], author=data['author'], user=self.user)
        comment.save()

    def clean(self):
        return self.cleaned_data

views.py

@login_required
def create(request):
    try:
        if is_post(request):
            form = CommentCreationForm(request.user)
            if form.is_valid():
                print 'valid'
                form.save()
                return render_to_response("login.html", context_instance = RequestContext(request))
            return render_to_response("login.html", context_instance = RequestContext(request))
        return render_to_response("create.html", {'form':CommentCreationForm()}, context_instance = RequestContext(request))
    except Exception as e:
        print str(e)

フォームを送信すると、次のように返されます。'User'オブジェクトには属性'get'がありません。私は何か非常に間違ったことをしていると確信していますが、何が起こっているのかわかりません。

4

1 に答える 1

0

まず、フォームが正しく初期化されていません。署名はForm.__init__次のようになります。

Form.__init__(data=None, files=None, ...)

# When you put
form = CommentCreationForm(request.user)
# The data is feed w/ request.user ...

次に、呼び出しコードが次の場合を除き、self.user = kwargs.pop('user', None)常に に設定さself.userれます。None

form = CommentCreationForm(request.POST, user=request.user) 

最後に、より良いアプローチはrequest.user、いくつかのスコープで を直接参照することです。次に例を示します。

def make_commment_form_cls(user):

    class CommentCreationForm(forms.Form):
        body = forms.CharField(widget=forms.Textarea)
        author = forms.CharField()

        def save(self):
            data = self.cleaned_data
            # HERE
            comment = Comment(body=data['body'], author=data['author'], user=user)
            comment.save()

    return CommentCreationForm

作成ビューで

# replace 
form = CommentCreationForm(request.user)
# with
form = make_comment_form_cls(request.user)(request.POST)
于 2013-03-09T12:15:17.427 に答える