我已經構建了一個應用程序,它有許多類似的視圖,應該能夠使用相同的基本代碼。然而,每種方法在方法中的各種拐點處都有一些獨特的特徵,這樣我就不能找出一種方法來構造這個來真正重用任何代碼。相反,我創建了一個剪切粘貼方法,並分別調整每種方法。這部分應用程序是我編寫的第一批Python代碼中的一部分,並且知道必須有更好的方法來做到這一點,但是我被鎖定在這樣做和「它工作」,所以我看不到出路。Django中的DRY視圖
下面介紹一下基本視圖模板基本上是這樣的:
def view_entity(request, entity_id=None):
if request.method == 'POST':
return _post_entity(request, entity_id)
else:
return _get_entity(request, entity_id)
def _get_entity(request, entity_id):
data = _process_entity(request, entity_id)
if 'redirect' in data:
return data['redirect']
else:
return _render_entity(request, data['form'])
def _post_entity(request, entity_id):
data = _process_entity(request, entity_id)
if 'redirect' in data:
return data['redirect']
elif data['form'].is_valid():
# custom post processing here
instance = data['form'].save()
return HttpResponseRedirect(reverse('entity', args=[instance.id]))
else:
return _render_entity(request, data['form'])
def _process_entity(request, entity_id):
data = {}
if entity_id != 'new': # READ/UPDATE
# sometimes there's custom code to retrieve the entity
e = entity_id and get_object_or_404(Entity.objects, pk=entity_id)
# sometimes there's custom code here that deauthorizes e
# sometimes extra values are added to data here (e.g. parent entity)
if e:
if request.method == 'POST':
data['form'] = EntityForm(request.POST, instance=e)
# sometimes there's a conditional here for CustomEntityForm
else:
data['form'] = EntityForm(instance=e)
else: # user not authorized for this entity
return {'redirect': HttpResponseRedirect(reverse('home'))}
# sometimes there's custom code here for certain entity types
else: # CREATE
if request.method == 'POST':
data['form'] = EntityForm(request.POST)
else:
data['form'] = EntityForm()
# sometimes extra key/values are added to data here
return data
我甚至沒有包括所有可能的變化,但你可以看到,_process_entity
方法需要基於大量的個人定製正在處理的實體的類型。這是我無法弄清楚這種干擾方式的主要原因。
任何幫助表示讚賞,謝謝!
你使用的是什麼版本的Django?如果它是Django 1.3或更高版本,則可以使用基於類的視圖來使視圖更加乾燥。 – 2012-07-12 18:41:42
我正在使用Django 1.3。你能詳細說明一下嗎? – mVChr 2012-07-12 18:42:11
請參閱https://docs.djangoproject.com/en/dev/topics/class-based-views/ - 每個視圖都是一個允許您使用和重用其他視圖的功能的類。但是你的觀點似乎做了很多事情:它創建對象,加載對象,呈現多種不同的表單,它執行重定向 - 這一切都太多了。這一切都需要在URL完成嗎?否則,我會重構成多個視圖。 – 2012-07-12 18:46:57