Django 的 DRY 方法
DRY approach for Django
在我的 urls.py
中,我有一些这样的条目:
url(r'auftragsarten/list/$', generic.ListView.as_view(
queryset=Auftragsart.objects.order_by('name'),
paginate_by=25),
name='auftragsarten_liste'),
url(r'^auftragsarten/form/$',
views.auftragsarten_form,
name='auftragsarten_form'),
url(r'auftragsarten/update/(?P<pk>[\d]+)/$',
views.AuftragsartUpdateView.as_view(),
name='auftragsarten_update'),
url(r'auftragsarten/delete/(?P<pk>[\d]+)/$',
views.AuftragsartDeleteView.as_view(),
name='auftragsarten_delete'),
很多标准模型都会重复这种情况,我只需要获取信息、列出它并能够编辑和删除它。
在我的 views.py
:
def auftragsarten_form(request):
form = AuftragsartenForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('auftragsverwaltung:auftragsarten_liste')
else:
print(form.errors)
return render(request, 'generic_form_template.html', {'form': form})
class AuftragsartUpdateView(UpdateView):
model = Auftragsart
fields = '__all__'
success_url = reverse_lazy('auftragsverwaltung:auftragsarten_liste')
template_name = 'generic_update_view.html'
class AuftragsartDeleteView(DeleteView):
model = Auftragsart
success_url = reverse_lazy('auftragsverwaltung:auftragsarten_liste')
template_name = 'generic_confirm_delete.html'
这一切都在这个模式之后重复。因此,对于 3 个模型,我将有 3 次大部分相同的代码,只有微小的变化。
我怎样才能停止重复自己?
要将其变成干旱(使用@e4c5 词),您可以在 url.py
中执行此操作(这次使用 Mitarbeiter
模型)
url(r'^mitarbeiter/list/$', generic.ListView.as_view(
queryset=Mitarbeiter.objects.order_by('name'),
paginate_by=25),
name='mitarbeiter_liste'),
url(r'^mitarbeiter/form/$',
generic.CreateView.as_view(
model=Mitarbeiter,
fields='__all__',
success_url=reverse_lazy('auftragsverwaltung:mitarbeiter_liste'),
template_name='generic_form_template.html',
),
name='mitarbeiter_form'),
url(r'^mitarbeiter/update/(?P<pk>[\d]+)/$',
generic.UpdateView.as_view(
model=Mitarbeiter,
fields='__all__',
success_url=reverse_lazy('auftragsverwaltung:mitarbeiter_liste'),
template_name='generic_update_view.html',
),
name='mitarbeiter_update'),
url(r'^mitarbeiter/delelte/(?P<pk>[\d]+)/$',
generic.DeleteView.as_view(
model=Mitarbeiter,
success_url=reverse_lazy('auftragsverwaltung:mitarbeiter_liste'),
template_name='generic_confirm_delete.html',
),
name='mitarbeiter_delete'
)
所以我的 views.py
中不需要单一视图。注意:这里没有 space 逻辑,只有基本的 CRUD。
网址:
url(r'^manage/list/(?P<model_name>.*)/$', MyCbv.as_view()),
观看次数:
from django.db.models import get_model
class BaseBackendView(object):
# Inherit this view so that your view will find the model name
# You can reuse it for adding / editing / deleting etc for all models
@property
def model(self):
return get_model('app_name', self.kwargs.get('model_name'))
在我的 urls.py
中,我有一些这样的条目:
url(r'auftragsarten/list/$', generic.ListView.as_view(
queryset=Auftragsart.objects.order_by('name'),
paginate_by=25),
name='auftragsarten_liste'),
url(r'^auftragsarten/form/$',
views.auftragsarten_form,
name='auftragsarten_form'),
url(r'auftragsarten/update/(?P<pk>[\d]+)/$',
views.AuftragsartUpdateView.as_view(),
name='auftragsarten_update'),
url(r'auftragsarten/delete/(?P<pk>[\d]+)/$',
views.AuftragsartDeleteView.as_view(),
name='auftragsarten_delete'),
很多标准模型都会重复这种情况,我只需要获取信息、列出它并能够编辑和删除它。
在我的 views.py
:
def auftragsarten_form(request):
form = AuftragsartenForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('auftragsverwaltung:auftragsarten_liste')
else:
print(form.errors)
return render(request, 'generic_form_template.html', {'form': form})
class AuftragsartUpdateView(UpdateView):
model = Auftragsart
fields = '__all__'
success_url = reverse_lazy('auftragsverwaltung:auftragsarten_liste')
template_name = 'generic_update_view.html'
class AuftragsartDeleteView(DeleteView):
model = Auftragsart
success_url = reverse_lazy('auftragsverwaltung:auftragsarten_liste')
template_name = 'generic_confirm_delete.html'
这一切都在这个模式之后重复。因此,对于 3 个模型,我将有 3 次大部分相同的代码,只有微小的变化。
我怎样才能停止重复自己?
要将其变成干旱(使用@e4c5 词),您可以在 url.py
中执行此操作(这次使用 Mitarbeiter
模型)
url(r'^mitarbeiter/list/$', generic.ListView.as_view(
queryset=Mitarbeiter.objects.order_by('name'),
paginate_by=25),
name='mitarbeiter_liste'),
url(r'^mitarbeiter/form/$',
generic.CreateView.as_view(
model=Mitarbeiter,
fields='__all__',
success_url=reverse_lazy('auftragsverwaltung:mitarbeiter_liste'),
template_name='generic_form_template.html',
),
name='mitarbeiter_form'),
url(r'^mitarbeiter/update/(?P<pk>[\d]+)/$',
generic.UpdateView.as_view(
model=Mitarbeiter,
fields='__all__',
success_url=reverse_lazy('auftragsverwaltung:mitarbeiter_liste'),
template_name='generic_update_view.html',
),
name='mitarbeiter_update'),
url(r'^mitarbeiter/delelte/(?P<pk>[\d]+)/$',
generic.DeleteView.as_view(
model=Mitarbeiter,
success_url=reverse_lazy('auftragsverwaltung:mitarbeiter_liste'),
template_name='generic_confirm_delete.html',
),
name='mitarbeiter_delete'
)
所以我的 views.py
中不需要单一视图。注意:这里没有 space 逻辑,只有基本的 CRUD。
网址:
url(r'^manage/list/(?P<model_name>.*)/$', MyCbv.as_view()),
观看次数:
from django.db.models import get_model
class BaseBackendView(object):
# Inherit this view so that your view will find the model name
# You can reuse it for adding / editing / deleting etc for all models
@property
def model(self):
return get_model('app_name', self.kwargs.get('model_name'))