2015-09-10 2 views
6

В моей urls.py У меня есть несколько записей, как эти:DRY подход к Джанго

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

Я не знаю, это выглядит довольно DRY для меня. Если будет какая-нибудь сухая, это будет засуха :-) – e4c5

+0

Я думал о возможностях этого трех видов, но только меняя модель или что-то в этом роде, я мог бы попытаться поместить все это в urls.py, как и представление generic_list, но это кажется как СУХОЙ, как я мог это сделать ... –

ответ

0

Для того, чтобы превратить его в засухе (использовать @ e4c5 слов), вы можете сделать это в url.py (на этот раз с 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' 
    ) 

Так мне не нужен один вид в моей views.py. NB: для логики здесь нет места просто базовым CRUD.

0

URLs:

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')) 
Смежные вопросы