2015-09-10 8 views
6

In meinem urls.py habe ich einige Einträge wie diese:DRY Ansatz für Django

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

Dies wiederholt sich für eine Vielzahl von Standard-Modelle, bei denen ich nur noch die Informationen zu erhalten, geben Sie es und in der Lage sein, zu bearbeiten und löschen es.

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

Es alle Wiederholungen nach diesem Muster. Also für 3 Modelle werde ich 3 mal den gleichen Code haben mit nur kleinen Änderungen.

Wie kann ich aufhören mich zu wiederholen?

+1

Ich weiß nicht, das sieht mir ziemlich trocken. Wenn es trockener wird, wird es eine Trockenheit :-) – e4c5

+0

Ich dachte an vielleicht diese drei Ansichten, aber nur das Modell oder etwas ändern, nun könnte ich versuchen, alles in die URLs.py, wie die generic_list Ansicht, aber das scheint So trocken, wie ich es schaffen könnte ... –

Antwort

0

Um es in eine Dürre zu drehen (@ e4c5 Worte verwenden, um) Sie können dies tun, in Ihrem url.py (diesmal mit dem Mitarbeiter Modell)

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

Also ich habe keine einzige Ansicht benötigen, meine views.py. NB: Hier gibt es keinen Platz für Logik, nur ein einfaches CRUD.

0

Urls:

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

Ansichten:

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