2010-03-04 4 views
2

각 필드에 3 개의 모델이 있습니다. 2 모델의 경우, 데이터를 요청하기 위해 장고의 create_object를 통해 일반 폼을 사용하는 것이 좋습니다. 내가 모델명을 허용하고 일반적인 형태의 3 모델의 경우Django : 일반 ModelForm 또는 사전 정의 된 양식 표시

url(r'^add_(?P<modelname>\w+)/$', generic_add), 

def generic_add(request, modelname): 
    mdlnm_model = models.get_model('catalog',modelname) 
    return create_object(request, 
     model = mdlnm_model, 
     template_name = 'create.html', 
     post_save_redirect = '/library/', 
     extra_context = {'func': 'Create ' + modelname}, 
     login_required = 'True' 
    ) 

에 사용자를 보내는 기능을 쓴 나는 경우 사용자가이 모델의 필드 중 하나를 생략 할 수 있도록, I는 ModelForm 클래스 정의 양식을 본다.

url(r'^create_actor/$', create_object, Actor_Input, name='db_actor_create'), 

Actor_Input = { 
    'form_class': ActorForm, 
    'template_name': 'create.html', 
    'post_save_redirect': '/library/', 
    'extra_context': {'func': 'Create Actor'}, 
    'login_required': 'True' 
} 

class ActorForm(forms.ModelForm): 
    class Meta: 
      model = Actor 
      fields = ('name','age','height','short_description', 
        'long_description') 

장고가 존재하는 경우 정의 된 ModelForm를 표시하지만, 정의 된 양식이 이루어진다 된 경우 그렇지 않으면 완전히 일반적인 양식을 표시 할 수있는 방법이 있나요? 나는 더 많은 모델을 만들 것으로 기대하고 있으며, 배우가되는 방식으로 분리되어야하는 모든 단일 모델에 대한 URL을 생성하지는 않을 것입니다.

그래서 다른 방법으로 generic_add 함수를 변경하여 ActorForm (있는 경우)을 사용하지만 generic ModelForm은 사용하지 않으려합니다. ActorForm 클래스의 존재 여부를 확인하는 방법을 알고 있지만, 동적 인 것으로하려면 어떻게해야할까요? 뭔가 같은 검사 : modelname + '폼'이 존재합니다. 나는 동적으로 사용자를 미리 정의 된 양식으로 보내는 방법을 확신 할 수 없다.

제안 사항? 이 문제를 볼 수있는 더 좋은 방법이 있습니까?

+0

귀하의 설명에서 전반적으로 달성하고자하는 것을 따라 가는데 어려움을 겪고 있습니다. 당신은 당신이 지금까지 가지고있는 것을 볼 수 있도록 어딘가에 붙여 넣기 저장소에 관련 비트를 붙여 넣기가 편합니까? –

+0

죄송합니다. 수정 된 질문 –

답변

0

당신이 말하는이 기능을 보는 것이 매우 도움이 될 것입니다.
create_object을 사용하는 일반적인 방법은 실제로 사용할 모델이나 양식을 지정하는 것이므로 세 개의 URL이 필요합니다. documentation에서

:

필수 인수 :

  • 어느 form_class 또는 model이 필요합니다.
    form_class을 입력하면 django.forms.ModelForm 하위 클래스 여야합니다. 모델의 양식을 사용자 정의해야 할 때이 인수를 사용하십시오. 자세한 내용은 ModelForm 문서를 참조하십시오.
    그렇지 않으면 model은 Django 모델 클래스 여야하며 사용되는 양식은 모델의 경우 ModelForm 표준이됩니다.

사용하는 양식을 지정할 수 있습니다. 어쩌면 이것은 이미 당신을 도울 것입니다, 그러나 더 이상의 정보없이 우리는 더 많은 일을 할 수 없습니다.

url(r'^add_(?P<model_name>\w+)/$', generic_add), 

model_presets = { 
    'Actor': { 
     'extra_context': {'func': 'Create Actor'}, 
     'form_class': ActorForm, 
     'login_required': True, 
     'post_save_redirect': '/library/', 
     'template_name': 'create.html' 
    }, 
    'default': { 
     'extra_context': {'func': 'Oops, something went wrong if you are seeing \ 
            this, it should have been overwritten!'}, 
     'form_class': None, 
     'login_required': True, 
     'model': None, 
     'post_save_redirect': '/library/', 
     'template_name': 'create.html' 
    } 
} 

def _create_object_conf_helper(request, model_name): 
    if model_name in model_presets: 
     conf = model_presets[model_name] 
    else: 
     try: 
      named_model = models.get_model('catalog', model_name) 
     except: 
      # do something here to protect your app! 
     conf = model_presets['default'] 
     conf['model'] = named_model 
     conf['extra_context']['func'] = 'Create %s' % model_name 
    conf['request'] = request 
    return conf 

def generic_add(request, model_name): 
    return create_object(**_create_object_conf_helper(request, model_name)) 

내가이 테스트를하지 않은 있지만, 잘 작동은 '아무튼 경우 알려 주시기한다 : 여기

+0

을 참조하십시오. 위 질문을 개정했습니다. 하지만 기본적으로 form_class가 있으면 사용할 수 있기를 원하지만 그렇지 않으면 표준 ModelForm을 사용합니다. –

1

은 아마 당신이 뭘 하려는지에 접근 할 방법입니다 내 자신의 프로젝트에서 비슷한 것을 사용하고 싶을 수도 있습니다.

또한이 단계를 더 진행하고 model_presets dict에 다른 레이어를 만들어 유사한 도우미 함수가 사용중인 다른 일반보기에 대한 구성을 만들 수 있도록 할 수 있습니다.

사실, 따옴표로 True를 묶을 필요는 없으며 T를 대문자로하고 행을 쓰는 것을 잊지 마십시오. 그러면 1 비트 부울 상수로 해석됩니다. 'True'를 사용하면 최소 32 비트의 (거친) 문자열을 문자열로 사용합니다. if 문에서 둘 다 true로 테스트되므로 큰 문제는 아닙니다. 반면 '거짓'을 사용하면 예상대로 작동하지 않습니다. 다시 한번 이것이 부울이 아닌 문자열이기 때문에 true로 테스트됩니다.

http://docs.python.org/library/stdtypes.html#truth-value-testing을 참조하십시오.

관련 문제