同じベースコードを使用できるはずの類似したビューがたくさんあるアプリケーションを作成しました。ただし、各メソッドには、メソッド内のさまざまな変曲点で特定の固有の特性があるため、コードを実際に再利用するためにこれを構造化する方法を理解できません。代わりに、カットアンドペーストの方法論を作成し、各メソッドを個別に微調整しました。アプリケーションのこの部分は、私がこれまでに作成した最初のPythonコードの一部であり、これを行うためのより良い方法があるはずですが、私はこの方法でそれを行うことに固執し、「動作する」ので、抜け道がわかりません。 。
基本ビューテンプレートは基本的に次のようになります。
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
方法では、処理されるエンティティのタイプに基づいて、多くの個別のカスタマイズが必要です。これが、これを処理するためのDRYの方法を理解できない主な理由です。
どんな助けでもありがたいです、ありがとう!