Django:为基于类的视图扩展get_object

Gre*_*gor 7 django subclassing django-generic-views

作为一个非专业的Python程序员,我正在寻找有关扩展Django的SingleObjectMixin类的get_object方法的方式的反馈.

对于我的大多数细节视图,使用pk或slugfield进行查找很好 - 但在某些情况下,我需要根据其他(唯一)字段检索对象,例如"username".我将Django的DetailView子类化,并修改了get_object方法,如下所示:

# extend the method of getting single objects, depending on model
def get_object(self, queryset=None):

    if self.model != mySpecialModel:
        # Call the superclass and do business as usual 
        obj = super(ObjectDetail, self).get_object()
        return obj

    else:
        # add specific field lookups for single objects, i.e. mySpecialModel
        if queryset is None:
            queryset = self.get_queryset()

        username = self.kwargs.get('username', None)
        if username is not None:
            queryset = queryset.filter(user__username=username)
        # If no username defined, it's an error.
        else:
            raise AttributeError(u"This generic detail view %s must be called with "
                                 u"an username for the researcher."
                                 % self.__class__.__name__)

        try:
            obj = queryset.get()
        except ObjectDoesNotExist:
            raise Http404(_(u"No %(verbose_name)s found matching the query") %
                          {'verbose_name': queryset.model._meta.verbose_name})
        return obj
Run Code Online (Sandbox Code Playgroud)

这是好习惯吗?我尝试使用一个Detailview子类,当需要检索不同的对象时,它会根据不同的需求进行调整 - 但这也维护了常见案例的默认行为.或者为特殊情况设置更多子类是否更好?

谢谢你的建议!

Ber*_*ant 9

您可以将类slug_field上的变量设置为DetailView应该用于查找的模型字段!在url模式中,它总是必须被命名slug,但是您可以将它映射到您想要的每个模型字段.

此外,您还可以覆盖仅在默认情况下返回DetailViewget_slug_field-method self.slug_field!

  • 每个人都知道基于泛型类的视图的文档介于坏与坏之间. (7认同)
  • 谢谢!完全错过了这一部分,被get_object中的注释抛弃了:`默认情况下,这需要在URLconf中使用"self.queryset"和"pk"或"slug"参数,但是子类可以覆盖它以返回任何对象. (2认同)