【问题标题】:Django: CommentForm Not Working Correctly, No Error?Django:CommentForm 无法正常工作,没有错误?
【发布时间】:2013-03-09 09:02:12
【问题描述】:

尝试如下创建评论表单:

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)

如果我提交表单,它会返回:“用户”对象没有“获取”属性。我确定我做错了什么,但我不知道是什么。

【问题讨论】:

  • 我认为问题出在你的保存方法上,试试这样:
  • comment = Comment(body=data['body'], author=data['author'], user_id=1)。让默认用户测试它是否会保存

标签: python django forms


【解决方案1】:

首先,表单初始化错误,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)

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多