簡體   English   中英

Django的DRY方法

[英]DRY approach for Django

在我的urls.py我有一些像這樣的條目:

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

我怎么能停止重復自己?

要把它變成干旱(使用@ 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不需要單個視圖。 注意:這里只有基本的CRUD沒有邏輯空間。

網址:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM