Django:为基于类的 View 扩展 get_object

标签 django subclassing django-generic-views

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

对于我的大多数 Detail View ,使用 pk 或 slugfield 进行查找很好 - 但在某些情况下,我需要根据其他(唯一)字段检索对象,例如“用户名”。我子类化了 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

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

谢谢你的建议!

最佳答案

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

此外,您还可以覆盖 DetailViewget_slug_field -方法只返回 self.slug_field默认!

关于Django:为基于类的 View 扩展 get_object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6789136/

相关文章:

python - Django 错误 admin.E033 : username is not an attribute of users. 自定义用户。为什么我的自定义用户管理不起作用?

Django 必须是 "User"实例

Django 自定义表单验证最佳实践?

ios - 读取 NSTimer 子类的 public var valid 失败,错误为 'isValid only defined for abstract class'

django - 如何使用 django 基于日期的通用 View

django - 在 python/django 中的线程之间共享事务范围? (PostgreSQL)

c++ - 在 C++ 中,重写现有虚函数是否会破坏 ABI?

ios - Swift 2.2 - SpriteKit - 子类 SKSpriteNode 类

python - 如何在 FormMixin 中添加两个 form_class?

Django:在通用 View 中处理空查询集