1

マルチテーブル モデルの継承を使用するモデルに関連するフォームセットがあります。フォームを送信すると、次のエラーが表示されます。

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)

フォームセットに使用されるフォームは次のとおりです。

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)

次のように、ビューでフォームセットを構築しようとしました。

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 %}ループで使用するようにしています。

彼自身の質問に対するエリックの答えを見て、 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)

これを修正する方法を知っている人はいますか?正しいインスタンスを更新するには、親モデルへのポインターがフォームに含まれている必要があることは理解していますが、どうすればそれを達成できますか? ありがとう!

4

1 に答える 1

1

あなたの例からサンプルアプリケーションを作成しましたが、フォームを送信すると期待どおりに機能しましたが、あなたが言及したエラーは発生しませんでした。

あなたの場合、をmediaitem_ptr使用してレンダリングするときに非表示の入力を取得する必要があります{{ form }}。あなたが参照した回答では、作成者はフィールドを個別にレンダリングしています。その場合、ポインター入力フィールドを手動で含める必要があります。

于 2013-06-18T07:08:50.580 に答える