2015-09-10 59 views
6

DRY方法在我urls.py我有一些條目這樣的: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'), 

這重複了很多標準型號,我只是要得到的信息,列出它並能夠編輯和刪除的它。

在我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次大部分相同的代碼,只需稍作更改。

我該如何停止重複自己?

+1

我不知道,這個看起來很乾了。如果它變得乾燥,這將是一場乾旱:-) – e4c5

+0

我想也許這三個意見,但只改變模型或什麼的,以及我可以嘗試把它放在urls.py,像generic_list視圖,但這似乎像DRY一樣,我可以讓它... –

回答

0

把它變成一個乾旱(使用@ e4c5的話),你可以(與Mitarbeiter型號這段時間),這樣做是你的url.py

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。注意:這裏沒有邏輯空間,只有基本的CRUD。

0

網址:

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