저는 mixin 클래스를 작성하여 ModelForm에 동적으로 추가 필드를 추가합니다.ModelForm의 메타 클래스가 추가 필드를 추가하지 못하도록합니다.
새로운 필드는 mixin의 __init__
메소드에서 생성됩니다. 울부 짖는 소리를 참조하십시오 :
믹스 인 클래스 코드를 (강하게 & 단순화를 단축) :
는class ForeignFieldsMixin(object):
# …
def __init__(self, *args, **kwargs):
# …
instance = kwargs.get('instance')
self.fields[extra_field_name] = fields_for_model(fmodel, (fldname,))
# ^^^^^^ here a new field instance is added
self.fields[extra_field_name].initial = 'some value'
# ^^^^^^ here is set an inital value for the new field
# …
그러나 폼의 클래스는 여전히 Meta.fields
에 새 필드 이름을 나열 거부 :
class ContactAdminForm(ForeignFieldsMixin, forms.ModelForm):
# …
class Meta:
model = Contact
fields = ('title', 'extra_field_name',)
과 실패 다음 예외가 있습니다.
File "../lib/python2.7/site-packages/django/forms/models.py", line 215, in __new__
raise FieldError(message)
FieldError: Unknown field(s) (extra_field_name) specified for Contact
정의의 시간에 ModelForm's
메타 클래스 (또는 그 조상 중 일부)가 의심됩니다. 클래스가 인스턴스화되기 전에는 추가 된 새 필드 이름을 아직 모르기 때문에이 예외가 발생합니다.
문서가이 영역에서 드문 드문 있기 때문에 잘못된 방향에서 가져 가고 있는지 잘 모르겠습니다. 나는 ModelForm's
metaclass의 원숭이 패치를 피하고 싶습니다.
기본 코드 내 필드 정의를 시뮬레이션하여 장고의 클래스 모델을 메타 클래스 보호기로 만족시키는 방법은 있지만 일반적으로 적용 가능한 클래스/함수로 동적으로 수행합니까?
__init__ 메소드에서 'extra_field_name'var을 정의하는 위치가 표시되지 않습니다. 또한 슈퍼 클래스를 호출해야합니다. super (ForeignFieldsMixin, self) .__ init __ (* args, ** kwargs) – Esteban
'super'를 호출합니다. 걱정하지 마십시오. 'extra_field_name'은 즉석에서 생성되지만 중요하지 않습니다. 이 예제에서는 일반적으로 새 필드를 만드는 방법을 보여줍니다. –