2014-06-24 2 views
0

저는 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의 원숭이 패치를 피하고 싶습니다.

기본 코드 내 필드 정의를 시뮬레이션하여 장고의 클래스 모델을 메타 클래스 보호기로 만족시키는 방법은 있지만 일반적으로 적용 가능한 클래스/함수로 동적으로 수행합니까?

+0

__init__ 메소드에서 'extra_field_name'var을 정의하는 위치가 표시되지 않습니다. 또한 슈퍼 클래스를 호출해야합니다. super (ForeignFieldsMixin, self) .__ init __ (* args, ** kwargs) – Esteban

+0

'super'를 호출합니다. 걱정하지 마십시오. 'extra_field_name'은 즉석에서 생성되지만 중요하지 않습니다. 이 예제에서는 일반적으로 새 필드를 만드는 방법을 보여줍니다. –

답변

0

fields 튜플에 추가 필드를 지정하고 싶지 않거나 지정할 필요가 없습니다. __init__에 수동으로 추가하기 때문에 fields에 넣는 것은 적합하지 않습니다.

+0

그래서 폼에서 사용할 추가 필드를 어떻게 설정할 수 있습니까? 또한 원래 필드와 같이 지정된 위치에 배치하고 싶습니다. 이제 양식이 렌더링되었지만 추가 된 필드가 추가되었습니다. –

+0

Field 인스턴스를'self.fields'에 추가하면됩니다. 'fields_for_model'로 무엇을하려고하는지 이해할 수는 없지만 : self.fields의 각 항목은 그 함수가 반환하는 필드의 내용이 아니라 실제 필드라고 가정합니다. 그리고 ordering은 무의미하다 : form.as_p로 폼을 출력하는 것처럼 들린다. 이것은 정말로 간단한 프로토 타이핑 툴이며 실제로 적절한 코드로 사용되어서는 안된다. 템플리트에서 필드를 개별적으로 지정하십시오. –

+0

anwser에 감사드립니다. 폼의'self.fields'가 새로운 필드를 포함하고 있으며 초기 값으로 설정되어 있는지 확인할 수 있습니다. 그러나 여전히 폼에는 빠져 있습니다. Form *에는'django.contrib.admin.options.ModelAdmin'에 할당되고'admin.site.register'로 등록 될 때 생성되는 템플릿 *이 없습니다. 아이디어를 잃어 버렸습니다. 시간 내 줘서 고마워. –

관련 문제