-1

__init__()データベースから追​​加の値を含めるために、Django フォームのメソッドをオーバーライドする方法を理解するのに苦労しています。ユーザーのフォームオプションとしてリストしようとしている写真家のグループがあります。その後、ユーザーの写真家の選択が (他の情報と共に) 新しいモデルのインスタンス化としてデータベースに追加されます。

これは、私の他のCurrent Questionの続き、または詳細です。@Rob Osborne は、 を拡張する方法を理解するのに役立つ素晴らしいアドバイスをくれましたBaseFormが、それでもコードを実行できません。興味がある場合は、リンクされた質問に私のモデル、フォーム、およびビューがリストされています。ModelForm を使用する方が簡単で、文書化されていることは理解していますが、この場合は BaseForm を使用する必要があります。

ここに私が持っているものがあります:

class AForm(BaseForm):
    def __init__(self, data=None, files=None, instance=None, auto_id='id_%s',
                 prefix=None, initial=None, error_class=ErrorList,
                 label_suffix=':', empty_permitted=False):

        self.instance = instance
        object_data = self.instance.fields_dict()
        self.declared_fields = SortedDict()
        self.base_fields = fields_for_a(self.instance)

        BaseForm.__init__(self, data, files, auto_id, prefix, object_data,
                      error_class, label_suffix, empty_permitted)
        self.fields['photographer'].queryset = Photographer.objects.all()

    def save(self, commit=True):
        if not commit:
            raise NotImplementedError("AForm.save must commit it's changes.")

        if self.errors:
            raise ValueError(_(u"The Form could not be updated because the data didn't validate."))

        cleaned_data = self.cleaned_data

        # save fieldvalues for self.instance
        fields = field_list(self.instance)

        for field in fields:
            if field.enable_wysiwyg:
                value = unicode(strip(cleaned_data[field.name]))
            else:
                value = unicode(cleaned_data[field.name])

上記のコードを使用すると、KeyError at 'photographer'.

この KeyError を解決photographerして、フォームに値を取得できるようにする方法についてのアイデアやコメントに感謝します。ありがとうございました!


編集:

@supervacuo で推奨されているように、super を使用しようとしていますが、KeyError at photographer以前と同じように取得しています。

class AForm(BaseForm):
    def __init__(self, data=None, files=None, instance=None, auto_id='id_%s',
             prefix=None, initial=None, error_class=ErrorList,
             label_suffix=':', empty_permitted=False):

        super(AForm, self).__init__(data, files, auto_id, prefix, object_data,                         error_class, label_suffix, empty_permitted)
        self.fields['photographer'].queryset = Photographer.objects.all()

KeyError を生成している何が欠けている可能性がありますか? アドバイスをありがとう。


編集2:追加fields_dict()

models.py から

class A(models.Model):
    category = models.ForeignKey(Category)
    user = models.ForeignKey(User)

    def fields_dict(self):
        fields_dict = {}
        fields_dict['title'] = self.title

        for key, value in self.fields():
            fields_dict[key.name] = value.value

        return fields_dict

アドバイスをありがとう。


EDIT 3:(class AForm詳細情報を含めるために、上記の最初の質問でも編集されています)

def fields_for_a(instance):
    fields_dict = SortedDict() 
    fields = field_list(instance)

    for field in fields:
        if field.field_type == Field.BOOLEAN_FIELD:
            fields_dict[field.name] = forms.BooleanField(label=field.label, required=False, help_text=field.help_text)
        elif field.field_type == Field.CHAR_FIELD:
            widget = forms.TextInput
            fields_dict[field.name] = forms.CharField(label=field.label, required=field.required, max_length=field.max_length, help_text=field.help_text, widget=widget)

            fields_dict[field.name] = field_type(label=field.label,
                                             required=field.required,
                                             help_text=field.help_text,
                                             max_length=field.max_length,
                                             widget=widget)

    return fields_dict

編集 4: def フィールド (自己)。models.py から:

    def fields(self):
        fields_list = []
        fields = list(self.category.field_set.all())
        fields += list(Field.objects.filter(category=None))

        for field in fields:
            try:
                fields_list.append((field, field.fieldvalue_set.get(ad=self),))
            except FieldValue.DoesNotExist:
                pass  # If no value is associated with that field, skip it.

        return fields_list

    def field(self, name):
        if name == 'title':
            return self.title
        else:
            return FieldValue.objects.get(field__name=name, ad=self).value
4

2 に答える 2

1

あなたの呼び出しBaseForm.__init__は間違っているようです。super()を使用する必要があります。

class AForm(BaseForm):
    def __init__(self, *args, **kwargs):

        super(AForm, self).__init__(*args, **kwargs)
        self.fields['photographer'].queryset = Photographer.objects.all()

(Rob Osbourneの他の質問に対する受け入れられた回答で実際に推奨されているように)。

fields_dict()それを超えて、 Djangoの一部ではなく、定義を提供していないあなたの方法を疑っています。print self.fields.keys()なんらかの不思議な理由でphotographerそこにないことを確認してから、のコードを投稿してfields_dict()ください。

于 2012-08-15T16:34:23.863 に答える
1

その GitHub リンクは、質問の最初にあるはずです。

django-classifiedsアプリケーションには動的フィールドのシステム全体 (FieldおよびFieldValueモデルに基づく) があるため、問題が発生しています。のこの側面を完全に理解していない場合はdjango-classifieds、代わりに別のものに基づいてプロジェクトを作成することをお勧めします。

FIELD_CHOICESindjango-classifiedの のリストを調べてみると、models.pyこのデータベース主導のフィールド システムを使用してリレーションシップを定義することはできません。つまり、動的なカテゴリごとのForeignKeyフィールドはありません。

photographer別の方法は、モデルにフィールドを追加することAです(名前を変更した特定の理由はありますAdか?)、他の質問に基づいて行ったようです。ただし、残りの距離を移動するには、次のfields_dict()ようにメソッドを編集する必要があります。

def fields_dict(self):
    fields_dict = {}
    fields_dict['title'] = self.title
    fields_dict['photographer'] = self.photographer

    for key, value in self.fields():
        fields_dict[key.name] = value.value

    return fields_dict
于 2012-08-17T17:21:39.330 に答える