您可以在Django中为我展示具有基于类的视图的Mixins示例吗?有什么用?

问题描述

我是Django的新手,我通常使用基于函数的视图。但是我看到将mixins与基于类的视图一起使用会更强大。我做了很多研究,但仍然对如何使用Mixins感到困惑。 Mixins是如何在多个类之间重用代码的绝佳方法

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

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

解决方法

我认为文档非常完美: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 

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

class Post(TimestampableMixin,TaggingMixin):
    ...

观看次数

我在自己的视图中并不经常使用它们,但有一次我使用它们反复从网址中获取相同的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中使用混合的方式。您可以将其应用于框架的几乎每个方面。例如。在django的管理站点中,以 Forms 等形式扩展ModelAdmin并为其添加更多功能。我链接的文档正在解释所有这些内容,当您阅读这些文档时会有所了解。