메서드를 내 장고 양식에서 오버 라이드하는 방법을 알아 내려고 노력하여 데이터베이스의 추가 값을 포함하려고합니다. 나는 사용자를위한 양식 옵션으로 나열하려고하는 사진 작가 그룹이 있습니다. 그런 다음 사용자의 사진 작가 선택이 새 모델의 인스턴스로 생성되어 다른 정보와 함께 데이터베이스에 추가됩니다.오버 라이드 __init__ : 폼 확장 (Python/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'
에 위의 코드 결과를 사용 : 여기
내가 가진 것입니다.
photographer
값을 얻을 수 있도록이 KeyError 문제를 해결하는 방법에 대한 아이디어 나 의견을 보내 주시면 감사하겠습니다. 고맙습니다!
편집 :
가 @supervacuo에서 권장하는대로, 슈퍼를 사용하려고하지만, 여전히 점점 KeyError at photographer
이전과 : 나는이 KeyError를 생성한다 누락 될 수 무엇
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()
? 어떤 조언을 주셔서 감사합니다.
편집 2 : models.py에서 fields_dict()
어떤 조언을
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
EDIT 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
과 같이
fields_dict()
메서드를 편집해야합니다. ModelForm 또는 일반 폼을 사용하고 있습니까? 원래 질문에서 명확하지 않습니다. 일반 양식을 사용하는 경우 필드를 양식에 추가해야합니다. –ModelForm이 아닌 BaseForm을 사용하고 있습니다. 댓글 주셔서 감사합니다. [이것은 링크입니다] (http://docs.nullpobug.com/django/trunk/django.forms.forms.BaseForm-class.html) BaseForm 정보. django의 소스 BaseForm 클래스에 대한 링크입니다. (https://github.com/django/django/blob/master/django/forms/forms.py). 어떤 아이디어 주셔서 감사합니다. –
음, 나는 투표하지 않았다. 나는 당신이 사용하고 있는지 확실하지 않았습니다 –