2015-09-10 17 views
6

Nel mio urls.py ho alcune voci come queste:approccio DRY per 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'), 

Questo si ripete per un sacco di modelli standard in cui non mi resta che ottenere le informazioni, elencare ed essere in grado di modificare ed eliminare esso.

Nel mio 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' 

Tutto si ripete dopo questo modello. Quindi per 3 modelli avrò un codice per lo più identico a 3 volte con modifiche minori.

Come posso smettere di ripetermi?

+1

Non lo so, questo sembra abbastanza asciutto per me. Se diventa più secco sarà una siccità :-) – e4c5

+0

Ho pensato a forse queste tre viste ma cambiando solo il Modello o qualcosa del genere, beh, potrei provare a mettere tutto nella urls.py, come la vista generic_list ma sembra piace come ASCIUTO come potrei farcela ... –

risposta

0

per trasformarlo in un periodo di siccità (per usare @ e4c5 parole) che si può fare questo nella vostra url.py (questa volta con il modello 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' 
    ) 

Quindi non ho bisogno di una visione unica nel mio views.py. NB: non c'è spazio per la logica qui solo CRUD di base.

0

gli URL:

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

visualizzazioni:

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