问题描述
我是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
并为其添加更多功能。我链接的文档正在解释所有这些内容,当您阅读这些文档时会有所了解。