【问题标题】:redundant django code多余的 Django 代码
【发布时间】:2013-01-29 00:59:31
【问题描述】:

我有一些我编写的代码,它可以很好地用于它的目的。

from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from cab.models import Language

class LanguageDetail(ListView):


    def get_queryset(self):
        slug = self.kwargs['slug']
        language = get_object_or_404(Language, slug=slug)
        return language.snippet_set.all()

    paginate_by = 20
    template_name = 'cab/language_detail.html'

    def get_context_data(self, **kwargs):
        slug = self.kwargs['slug']
        language = get_object_or_404(Language, slug=slug)
        context = super(LanguageDetail, self).get_context_data(**kwargs)
        context['language'] = language
        return context

我的问题是我在两个函数中重复了两行代码,我不喜欢这样。

slug = self.kwargs['slug']
language = get_object_or_404(Language, slug=slug)

我怎样才能避免这种情况? 提前致谢。

【问题讨论】:

  • 将其重构为单独的函数/方法

标签: python django django-views django-generic-views


【解决方案1】:

你的意思是这样的吗?

def get_slug(self, name):   
    slug = self.kwargs[name]
    return get_object_or_404(Language, slug=slug)

可以用作language = self.get_slug('slug')

请记住,如果kwargs 不包含name,那么它将引发错误。为了防止这种情况,您可以执行以下操作:

slug = self.kwargs.get(name, None)
if slug is not None:
    ...

【讨论】:

  • 函数最终会被调用两次,但没关系。我认为这是我们能做的最好的。我在想是否有办法扩展要在两个函数中使用的变量的范围。
  • @AmrFouad:要“扩展”范围,您可以将变量 slug 转换为实例变量,并在其前面加上 self.。但我认为它不会解决冗余问题。我的意思是,您需要确保在使用时已经设置了变量。
  • @stummjr 我尝试在课堂上直接使用它作为slug = self.kwargs["slug"],但它引发了错误self is not defined
  • @AmrFouad 您确定您尝试的方法将self 作为其第一个参数吗? (如前所述,我不认为将变量用作实例变量(以self为前缀)是一个好的解决方案,因为您必须注意变量是否已设置,所以它不能解决你的问题。)
  • @stummjr 我的意思是当我试图将该行直接放入类而不使用方法slug = self.kwargs["slug"] 时,它引发了错误self is not defined。所以我可以获取我正在搜索的语言对象,然后在另一个函数 get_querysetget_context_data 中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多