__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