【问题标题】:DRY approach for DjangoDjango 的 DRY 方法
【发布时间】:2015-09-10 06:59:08
【问题描述】:

在我的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 次大部分相同的代码,只需进行微小的更改。

我怎样才能停止重复自己?

【问题讨论】:

  • 我不知道,这对我来说看起来很干。如果它变得更干燥,那将是干旱:-)
  • 我想到了这三个视图,但只更改了模型或其他东西,我可以尝试将它们全部放在 urls.py 中,就像 generic_list 视图一样,但这似乎尽可能 DRY让它...

标签: python django dry


【解决方案1】:

要将其变成干旱(使用@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。

【讨论】:

    【解决方案2】:

    网址:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多