2015-09-10 12 views
6

W moim urls.py Mam niektóre wpisy takie jak:DRY podejście do 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'), 

ten powtarza się dla wielu standardowych modeli, w których po prostu trzeba uzyskać informacje, lista go i móc edytować i usuwać to.

w moim 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' 

To wszystko powtarza za tym wzorcem. Tak więc dla 3 modeli będę miał 3 razy w większości identyczny kod z niewielkimi zmianami.

Jak mogę przestać się powtarzać?

+1

nie wiem, to wygląda całkiem DRY do mnie. Jeśli pojawi się jakikolwiek osuszacz, będzie to susza :-) – e4c5

+0

Pomyślałem o może tych trzech widokach, ale tylko zmieniając Model lub coś takiego, cóż, mógłbym spróbować umieścić wszystko w urls.py, jak widok ogólny listy, ale to wydaje się jak jak DRY, jak mogłem to zrobić ... –

Odpowiedz

0

Aby przekształcić go w suszę (by użyć @ e4c5 słów) można to zrobić w swoim url.py (tym razem z Mitarbeiter Modelu)

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

Więc nie muszę pojedynczy widok w moim views.py. Uwaga: nie ma tu miejsca na logikę, tylko podstawowy CRUD.

0

URL:

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

odsłony:

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')) 
Powiązane problemy