2011-03-18 4 views
0

나는 수십 개의 모델을 가지고 있는데, 각각 하나의 연관된 ModelForm (Meta.model이 해당 모델을 참조 함)이 있습니다.모델이 주어진 Django ModelForm을 찾는 방법

예.

class FooModel(Model): 
    pass 

class FooModelForm(ModelForm): 
    class Meta: 
     model = FooModel 

# current approach using a classmethod 
FooModelForm.insert_in_model() # does cls.Meta.model.form = cls 

FooModelForm을 사용하면 FooModel을 쉽게 찾을 수 있습니다. 내가 원한 것은 REVERSE를 수행하는 가장 좋은 방법을 아는 것입니다 : FooModel 또는 심지어 "Foo"라는 문자열을 표시 할 때 FooModelForm을 찾으십시오.

여러 모델을 반환하는 솔루션이 좋지만 각 모델에 하나의 ModelForm 만 있다고 가정합니다.

현재 위의 그림과 같이 양식 클래스에 모델을 숨기고 있지만, 특히 중앙에서 계산할 수있는 더 나은 방법을 알고 싶습니다 (위의 마지막 줄은 없음).

편집 : Django: Display Generic ModelForm or predefined form과 같은 내용을 검토했지만 이보다 더 간단한 질문이라고 생각합니다. 장고 관리 코드는 내가 추구하는 것을 따라 뭔가를해야합니다. 그러나 get_model equivalent for ModelForms?은 이것이 부두교 일 수 있으며, 명시 적으로 연관을 추적하기 위해 dict['Foo']=FooModelForm 또는 그와 동등한 일을하는 것이 가장 좋을 것이라고 제안합니다. 반복되는 것 같습니다.

+0

프로젝트의 모든 ModelForm을 검색하여 모델을 찾아 값을 반환 할 수 있지만 어떤 목적으로 사용할 수 있습니까? 귀하의 현재 할당은 명시 적입니다 - 암시 적보다 낫습니다. –

답변

1

20 개 이하의 양식이있는 경우 사전을 매핑하는 것과 같은 소리가 가장 쉬운 방법입니다. 장고는 내부적으로 이런 일을합니다. ModelForms를 들어

은 장고 관리자는 modelform_factory를 통해 즉시이를 작성하므로 내가 볼 않는 get_model


에는 비교 방법은 당신의 방법은 총알 증거도 없다, 그러나 어느 모델의 라인이 필요 def.

ModelForm/model 인 경우 양식을 찾을 때까지 ModelForm 서브 클래스를 반복 할 수 있습니다. 내가 FooModel 또는 문자열 "푸"와 를 발표하고

찾기 FooModelForm.

modelforms = forms.ModelForm.__subclasses__() 
def get_modelform(model): 
    try: 
     return filter(lambda x:x.Meta.model == model, modelforms)[0] 
    except IndexError: 
     print "apparently, there wasn't a ModelForm for your model" 

당신은 문자열로 ModelForm을 끌어하려는 경우 app_label__name__이 함수에 get_model('app', 'model')를 사용하는 것이 더 쉬울 것이다 의미 올바른지 모두 확인해야합니다.

이 메서드를 메서드와 결합하여 해당 ModelForm을 가리키는 모델에 특성을 자동으로 배치 할 수 있습니다.

앱의 상단에있는 class_prepared 신호에 후크하여 해당 ModelForm을 찾고이를 Model 클래스에 연결하십시오. 도움을 주거나 아이디어를 줄 수 있기를 바랍니다.

+0

감사합니다. class_prepared에 대해 알지 못했습니다. – grp

관련 문제