2013-06-12 30 views
1

我有一個與使用multi-table model inheritance的模型相關的formset。我得到當表單提交以下錯誤:如何包含指向子模型formset中引用的父模型的指針?

MultiValueDictKeyError 

"Key 'form-0-mediaitem_ptr' not found in <QueryDict: {u'form-0-caption': 
[u'asfdasda'], u'form-MAX_NUM_FORMS': [u''], u'form-TOTAL_FORMS': [u'1'], u'form- 
INITIAL_FORMS': [u'1'], u'img_info_submitted': [u'save to library'], 
u'csrfmiddlewaretoken': ....... 

這裏的車型涉及:

class MediaItem(models.Model): 
    ''' 
    Parent class for all media items (ImageItem, VideoItem, 
    AudioItem, and TextItem). 
    ''' 
    user = models.ForeignKey(User) 
    upload_date = models.DateTimeField(auto_now_add = True) 
    last_modified = models.DateTimeField(auto_now = True) 

class ImageItem(MediaItem):   
    original_img = models.ImageField(upload_to = img_get_file_path) 
    large_img = models.ImageField(upload_to = img_get_file_path) 
    thumbnail_img = models.OneToOneField(ItemThumbnail) 
    caption = models.CharField(max_length = 1000, 
           blank = True) 

下面是用於該formset形式:

class ImageInfoForm(forms.ModelForm): 
    class Meta: 
     model = ImageItem 

    def __init__(self, *args, **kwargs): 
     super(ImageInfoForm, self).__init__(*args, **kwargs) 
     self.fields['caption'].widget = forms.Textarea(attrs = {'placeholder': 'caption'}) 

    caption = forms.CharField(widget = forms.Textarea(attrs = {'placeholder': 'caption'}), 
           max_length = 1000, 
           required = True) 

我我試圖在視圖中構建formset,如下所示:

ImageInfoFormset = modelformset_factory(ImageItem, 
             form = ImageInfoForm, 
             fields=['caption', 
               'mediaitem_ptr'], 
             extra = 0) 

而且,我也嘗試過這樣的:

ImageInfoFormset = modelformset_factory(ImageItem, 
             form = ImageInfoForm, 
             extra = 0) 

在模板中,我確保使用整個{{form}}標籤在{% for form in formset %}循環。

眼看Erik's answer到了自己的問題,How to debug a Django MultiValueDictKeyError on Formset POST,我改變了ImageForm爲以下,沒有運氣:-(

class ImageInfoForm(forms.ModelForm): 
    class Meta: 
     model = ImageItem 
     fields = (
      'mediaitem_ptr', 
      'caption') 

    def __init__(self, *args, **kwargs): 
     super(ImageInfoForm, self).__init__(*args, **kwargs) 
     self.fields['caption'].widget = forms.Textarea(attrs = {'placeholder': 'caption'}) 

    caption = forms.CharField(widget = forms.Textarea(attrs = {'placeholder': 'caption'}), 
           max_length = 1000, 
           required = True) 

有誰知道如何解決這一問題?我的理解是一個指向父模型將不得不在形式,以更新正確的實例,但我怎麼做到這一點?謝謝!

+0

您使用的是什麼版本的Django?當我使用示例模型和表單提交表單時,我沒有看到您提到的錯誤。你能發佈你的模板代碼嗎? – maulik13

+0

@ maulik13哇。所以,我們在整個應用程序的大多數頁面的頁眉中實現了這個圖片上傳表單。我們的模板繼承一直是基於應用程序的。我在一個模板的頭文件中使用了{{form}}(正確的;沒有使用這個頁面來測試),並且在另一個模板的頭文件中有{{form.caption}}(不正確,我正在使用這個頁面測試)。愚蠢的我。這是正確的一切...再見,浪費賞金:-( – sgarza62

+0

@ maulik13感謝您做所有的工作和測試它。因爲你的答案「我沒有得到你提到的錯誤」在技術上是正確的答案問題(引用我發佈的所有信息),我會很樂意將你的答案標記爲正確的,只是將它寫成答案,而不是評論 – sgarza62

回答

1

我從你的例子做了一個示例應用程序,當我提交了一個表單,它按預期工作,didn沒有你提到的錯誤。

對於您的情況,當您使用{{ form }}進行渲染時,您應該獲得mediaitem_ptr的隱藏輸入。在你引用的答案中,作者是單獨渲染字段,在這種情況下,你需要手動包含指針輸入字段。

相關問題