Django 中有非常多的类,比如 Model、View、Form 等。它们各自有各自的职责边界。
Model Manager and Model
观察下面的例子:
class ActiveManager(models.Manager):
def active(self):
return self.filter(active=True)
class Product(models.Model):
name = models.CharField(max_length=32)
description = models.TextField(blank=True)
price = models.DecimalField(max_digits=6, decimal_places=2)
slug = models.SlugField(max_length=48)
active = models.BooleanField(default=True)
in_stock = models.BooleanField(default=True)
date_updated = models.DateTimeField(auto_now=True)
tags = models.ManyToManyField(ProductTag, blank=True)
objects = ActiveManager()
def tag_count(self):
return self.tags.count()
def __str__(self):
return f"{self.name} ({self.pk})"
重点在 ActiveManager.active()
以及 Product.tag_count()
。可以看出前者是针对于 model 列表的操作,后者则是针对单个 model 的操作。
Form
Form 类应该只关心数据的 HTML 展现、检验、清洗。它里面不应该有业务逻辑。业务逻辑应该在 View 中实现。同时由于 Form 类拿不到 request object,因此它想做业务逻辑也很难。
django.contrib.auth.forms.AuthenticationForm
是一个例子,用户提交用户名密码后,AuthenticationForm
的 clean()
函数会对用户名密码做验证。
View
业务逻辑应该在 View 层实现。