'BlogForm'对象不可调用

时间:2013-04-03 10:31:30

标签: python django

我的Blog models.py是

class Blog(models.Model):
    title = models.CharField('Title', max_length=200)
    text = models.TextField('Text', max_length=2048)
    date = models.DateTimeField('Last Modified')

    def __unicode__(self):
        return '%s' % (self.title)

并在我的views.py中我试图将模型字段转换为表单字段然后附加数据,在以下views.py代码中我将获得一个页面,它只询问标题和文本... < / p>

class BlogForm(ModelForm): 
    class Meta:
        model = Blog
        fields=('title', 'text')

def add_blog(request, pID='0'):
    bf = BlogForm()
    message = 'Unknown Request'
    p = get_object_or_404(Person, pk=pID)

    if request.method == 'GET':
        message = 'Add Blog for %s ' % p.name

    if request.method == 'POST':
        if request.POST['submit'] == 'Add':
            SaveForm = BlogForm(instance=p)
            bf = BlogForm(request.POST.copy())
            postDict = request.POST.copy()
            postDict['date'] = datetime.datetime.now()
            save_bf = SaveForm(postDict)
            if save_bf.is_valid():
                try:
                    bObj = save_bf.save()
                    p.blogs.add(bObj)
                    p.save()
                    message = 'Blog added to %s.' % p.name
                except:
                    message = 'Database Error.'
            else:
                message = 'Invalid data in Form.'

    return render_to_response(
                     'people/add_blog_form.html',{'bForm': bf,'message':message})

“但在分配数据后,我会收到以下错误”

/ Blog / AddBlogForm / 1 /

中的TypeError

'BlogForm'对象不可调用

请求方法:POST Django版本:1.4.1 异常类型:TypeError 例外值:'BlogForm'对象不可调用

获取错误     “save_bf = SaveForm(postDict)”

2 个答案:

答案 0 :(得分:0)

您首先创建一个名为SaveForm的BlogForm实例(这是一个pep08违规BTW),然后您尝试调用此表单。 BlogForm类是可调用的(与Python中的任何其他类一样),但是(除非您在BlogForm上定义__call__(self, ...)方法,这有点令人惊讶)BlogForm实例本身不可调用。

作为旁注:您的代码非常混乱,使事情变得更加复杂。此外,我没有看到Blog和Person之间的关系,并且当你安装BlogForm时你没有为instance传递正确的值(当你应该是博客时你传递一个人 - 如果你只是想要创建一个博客)

答案 1 :(得分:0)

我真的不确定你在POST块内做了什么。您将表单实例化为SaveForm,然后再次将其实例化为bf,然后尝试调用传递post字典的第一个实例。我无法分辨应该达到的目标。

应该是:

if request.POST['submit'] == 'Add':
    postDict = request.POST.copy()
    postDict['date'] = datetime.datetime.now()
    bf = SaveForm(postDict)
    if bf.is_valid():

编辑实际上,我刚刚意识到p是一个Person实例。没有必要将它传递给表单,因为它是一个博客表单,而不是一个人形式。