你能给我展示 Django 中带有基于类的视图的 Mixins 示例吗?有什么用?

mr_*_*ing 3 python django mixins

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

何时或为何应使用基于类的视图?

如果您向我展示一个示例或比文档中更好的解释方式,我将不胜感激。

Dim*_*tar 5

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

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

楷模

对于模型:假设您希望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 

Run Code Online (Sandbox Code Playgroud)

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

class Post(TimestampableMixin, TaggingMixin):
    ...
Run Code Online (Sandbox Code Playgroud)

意见

我发现自己并不经常在视图中使用它们,但有一次我使用它们反复从 url 中获取相同的内容context_data和一些内容。kwargs

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

class DashboardMixin:

    def get_context_data(self):
        ...

# and then in the Views
class IndexView(DashboardMixin, View):
    ...
Run Code Online (Sandbox Code Playgroud)

请记住MRO(方法解析顺序)- 这就是 python 处理多重继承的方式。

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