2010-03-04 45 views
2

我有3個模型,每個模型都有不同的字段。對於其中的兩個模型,我可以使用通用表單(通過Django的create_object)來請求數據。我寫了接受該型號名稱,併發送用戶的一般形式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' 
    ) 

爲第三模式的功能,我有一個的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') 

有沒有辦法Django的顯示定義的ModelForm如果它存在,但以其他方式顯示完全通用的形式,如果定義的形式尚未作出?我預計會創建更多的模型,而不是爲每個需要按照Actor的方式拆分的模型創建一個url。

所以把不同的方式,我想改變generic_add功能,因此它會使用ActorForm(如果存在的話),但除此之外,通用的ModelForm。我知道如何檢查ActorForm類的存在,但是如果我希望它也是動態的呢?就像檢查:modelname +'Form'是否存在一樣。我不確定如何動態地將用戶發送到預定義的表單(如果存在)。

有什麼建議嗎?有沒有更好的方法來看待這個問題?

+0

我很難跟隨你試圖完成從你的描述總體。您是否很舒服地將相關位粘貼到某個位置的粘貼文件夾中,以便我們可以看到您到目前爲止的內容? – 2010-03-04 05:26:30

+0

道歉,請參閱修改後的問題 – 2010-03-04 13:30:11

回答

0

這將是非常有益的,看看這個功能,你在說什麼。
使用create_object的正常方式確實是指定您要使用的模型或表單,這將導致您的案例中有三個URL。

documentation

必需的參數:

  • 要麼form_classmodel是必需的。
    如果您提供form_class,它應該是django.forms.ModelForm的子類。 當您需要自定義模型的表格時使用此參數。有關更多信息,請參閱ModelForm文檔。
    否則,model應該是一個Django模型類,並用於將一個標準ModelForm爲模型的形式。

你看,你可以指定要使用的表格。也許這已經對你有所幫助,但沒有進一步的信息,我們不能做更多。

+0

我修改了上面的問題。但基本上,我希望能夠使用form_class(如果存在的話),否則標準ModelForm – 2010-03-04 13:31:09

1

這是我如何可能會接近你正在嘗試做的事:

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)) 

我沒有測試過這一點,但它應該工作正常,讓我知道,如果它不」因爲我可能想在自己的項目中使用類似的東西。

此外,您也可以藉此更進一步,創建另一個層到model_presets快譯通允許類似的輔助函數來爲您可能使用的任何其他通用視圖創建CONFIGS。

順便說一句,沒有必要把引號括起來,只記得大寫T而不是rue,它會解析爲1位布爾常量。使用'True'將一個(粗略的)最小32位作爲一個字符串。兩者都會在if語句中測試真實性,因此這不是什麼大問題。另一方面,使用'False'將不會如預期的那樣工作,因爲再一次,這是一個不是布爾值的字符串,因此也會測試爲true。

參見http://docs.python.org/library/stdtypes.html#truth-value-testing