我已经构建了一个应用程序,它有许多类似的视图,应该能够使用相同的基本代码。然而,每种方法在方法中的各种拐点处都有一些独特的特征,这样我就不能找出一种方法来构造这个来真正重用任何代码。相反,我创建了一个剪切粘贴方法,并分别调整每种方法。这部分应用程序是我编写的第一批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