2013-04-03 31 views
0

我的博客models.py是“BlogForm”对象不是可调用

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我想转换模型场形成场,然后附加数据,在下面的意见。 PY代码,我会得到一个页面,它要求标题和纯文本...

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}) 

“但subitting数据后,我会收到以下错误”在/博客/ AddBlogForm

类型错误/ 1/

'BlogForm' 对象不是可调用

请求方法:POST Django的版本:1.4.1 异常类型:类型错误 异常值: 'BlogForm' 对象不是可调用

得到错误的行 “save_bf = SaveForm(postDict)”

回答

0

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

作为一个方面说明:你的代码相当混乱,使事情变得比他们要复杂。此外,我没有看到博客和人之间的关系,并且当您发出BlogForm时您没有为instance传递正确的价值(您传递一个人时它应该是一个博客 - 或无,如果你只想创建一个博客)

+0

感谢布鲁诺,我是一个新手到Django,我正在通过以下Sams学习在24小时内教你自己的Django,目前我在第11小时卡住添加数据到数据库,因为本书在多年前被放弃, Django现在更新了,本书的代码适用于旧版本的django,这就是为什么我无法理解这个概念,请纠正我。 – Chethan

+0

这些年来没有多少变化(至少从Django 1.0 IIRC开始),并且在线教程和文档中有完整的记录。 FWIW,萨姆斯“在24小时内教你自己”,就我而言,书籍不值得纸和墨水。 –

+0

感谢布鲁诺的信息,如果你是如此善良,你能告诉我我是如何违反PEP8? – Chethan

0

我真的不知道你在做什么在POST块。您将表格实例化为SaveForm,然后再次将其实例化为bf,然后尝试调用第一个实例传递后字典。我无法说出应该达到的目标。

应该仅仅是:

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

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

+0

actully丹尼尔我需要博客添加到笔者在其他人表,博客表是人表一个参考表,所以我采用对例如,p.name持有人的姓名。 – Chethan

+0

@Chethan:在'instance'关键字有一个的ModelForm一个非常明确的含义 - (如果你想创建一个新的实例或'None'),用于编辑目的,它必须是_of形式的model_一个实例。在代码片段中也没有与Person模型的关系。 –

+0

@Daniel:我正在使用Person表名列来显示名称,这就是为什么我需要p作为Peron表实例,这是错误的吗? – Chethan