2

Django MongoDBFormsを使用してModelFormsを置き換えようとしていますが、フォームのインスタンスを保存すると、この非常に奇妙なエラーが発生します。

save()中に、mongoengine.Documentは、MongoDBFormがラップする_metadictのcascadeキーワードをチェックします。

次に、MongoDBFormはgetitemからKeyErrorをスローします

それが探しているそのカスケードキーは何ですか?!

私はそれを間違っていますか?

Request Method: POST
Request URL:    http://localhost:8000/add_item/Books
Django Version: 1.4.2
Exception Type: KeyError
Exception Value:    
0
Exception Location: /Users/holografix/.virtualenvs/troca/lib/python2.7/site-packages/mongodbforms/documentoptions.py in __getitem__, line 171
Python Executable:  /Users/holografix/.virtualenvs/troca/bin/python
Python Version: 2.7.3

models.pyからのモデル

class GenericItem(Document):
    owner_id = IntField(required=True)
    title = StringField(max_length=70, required=True)
    description = StringField(max_length=140, required=True)
    value = IntField()
    location = GeoPointField()
    offers = ListField(EmbeddedDocumentField('Offer'))

    def __unicode__(self):
        return self.title

    class Meta:
        abstract = False
        app_label = 'troca_app'
        db_table = 'generic_item'
        allow_inheritance = True

forms.pyで同等のModelForm

class ModelFormGenericItem(DocumentForm):
   class Meta:
       document = GenericItem
       fields = ('title', 'value', 'description')

フォームを処理する場所を表示する

@login_required
def add_item(request, category):

    if request.method == 'POST':        

        if category == 'Muffins':
            form = ModelFormMuffin(request.POST)        

        elif category == 'Cameras':
            form = ModelFormCameras(request.POST)        

        else:        
            form = ModelFormGenericItem(request.POST)

        form = ModelFormGenericItem(request.POST)

        if form.is_valid():
            #process the data in form.cleaned_data

            instance = form.save(commit = False)
            instance.owner_id = request.user.id
            instance.save(safe=True, cascade=)

            return HttpResponseRedirect('/thanks/')

    else:
        # Ensure that this is a "final" category:
        p = get_object_or_404( Category, categoryTitle = category )        
        i = Category.objects.filter( parentCategory = p )
        if i.count() != 0:
            raise Http404

        if category == 'Muffins':
            form = ModelFormMuffin()

        elif category == 'Cameras':
            form = ModelFormCameras()

        else:        
            form = ModelFormGenericItem()

    return render(request, 'item.html', {
        'form': form,
        'category': category,
    } )

Djangoエラーの詳細:

/Users/holografix/Documents/development/troca_proj/troca_app/views.py in add_item
            instance.save() ...
▶ Local vars
/Users/holografix/.virtualenvs/troca/lib/python2.7/site-packages/mongoengine/document.py in save
            warn_cascade = not cascade and 'cascade' not in self._meta ...
▶ Local vars
/Users/holografix/.virtualenvs/troca/lib/python2.7/site-packages/mongodbforms/documentoptions.py in __getitem__
        return self.meta[key] ...
▶ Local vars
4

1 に答える 1

0

編集: documentoptions.py のcontains () メソッドを実装すると、他に何も変更する必要なく修正されるようです。

なぜそれが起こっているのかわからないので、この問題をハッキングすることになりました...

次のように、mongodbforms.documentoptions に「has_key()」メソッドを追加しました。

def has_key(self, key):
    return self.meta.has_key(key)

そして、問題のある行を mongoengine からin演算子から has_key() メソッドのチェックに変更します。

warn_cascade = not cascade and not self._meta.has_key('cascade')

誰かが元のエラーがポップアップしているWTFだけに答えることができれば、それは素晴らしいことです!

于 2013-02-02T11:51:06.933 に答える