2013-04-03 33 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