, generic.ListView.as_view( queryset=Auftragsart...">

Dry approach for Django

In my urls.py , I have several such entries:

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

This is repeated for many standard models, where I just need to get information, list it and be able to edit and delete it.

In my 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' 

Everything repeats after this pattern. So for 3 models I will have 3 times more identical code with minor changes.

How can I stop repeating myself?

+6
source share
2 answers

To turn it into a drought (use the words @ e4c5), you can do it in your url.py (this time using the Mitarbeiter model)

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

Therefore, I do not need one view in my views.py . NB: there is no room for logic, just basic CRUD.

0
source

URLs:

 url(r'^manage/list/(?P<model_name>.*)/$', MyCbv.as_view()), 

Views:

 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')) 
0
source

All Articles