你能给我展示一个在 Django 中使用基于 class 的视图的混合示例吗?有什么用处?

Can you show me an example of Mixins with class-based views in Django? What is the usage?

我是Django的新手,我通常使用基于函数的视图。但我发现将 mixins 与基于 class 的视图结合使用会更加强大。我做了很多研究,但我仍然对如何使用 Mixins 感到困惑。为什么 Mixins 是跨多个 class 重用代码的绝佳方式?

何时或为何我应该使用基于 class 的视图?

如果你给我一个例子或比文档中更好的解释方式,我将不胜感激。

我认为相关文档非常完美:https://docs.djangoproject.com/en/3.1/topics/class-based-views/mixins/

到目前为止,这就是我使用 mixin 的方式。

型号

对于模型:假设您希望在您拥有的每个模型中都有 created_at, updated_at 字段。我会创建一个 TimestampableMixin,它看起来像这样。

(https://docs.djangoproject.com/en/3.1/topics/db/models/#abstract-base-classes)(为什么 abstract?)


class TimestampableMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True 

然后我会用 mixin 扩展我的其他模型。所有继承 TimestampableMixin 的模型都将包含这些字段。请记住,您可以在该 Post 模型中添加更多混入,例如 TaggingMixin

class Post(TimestampableMixin, TaggingMixin):
    ...

观看次数

我发现自己在我的观点中并不经常使用它们,但有一次我使用它们来反复从 url 中获得相同的 context_data 和一些 kwargs

所以我创建了一个 DashboardMixin 具有以下实现方法。

class DashboardMixin:

    def get_context_data(self):
        ...

# and then in the Views
class IndexView(DashboardMixin, View):
    ...

请记住 MRO(Method Resolution Order) - 这就是 python 处理多重继承的方式。

这就是我在 Django 中使用 mixin 的方式。您几乎可以在框架的每个方面应用它。例如。在 django 的管理站点中,向 ModelAdminForms 等扩展和添加更多功能。我链接的文档解释了所有这些,当你阅读它时你会得到更好的想法。