【发布时间】:2021-08-16 16:49:36
【问题描述】:
我有一个模型 mixin,它设置了 created_at、created_by、updated_at 和 updated_by,然后我将它们继承给我项目中的大多数模型。这个模型 mixin 工作正常。显然,由于auto_now_add 和auto_now,设置created_at 和modified_at 非常容易。
class Timestampable(models.Model):
created_at = models.DateTimeField(
auto_now_add=True,
db_index=True,
verbose_name=_('created at')
)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="created%(app_label)s_%(class)s_related", on_delete=models.SET_NULL)
updated_at = models.DateTimeField(
auto_now=True,
db_index=True,
verbose_name=_('updated at')
)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="updated%(app_label)s_%(class)s_related", on_delete=models.SET_NULL)
class Meta:
abstract = True
ordering = ['-created_at']
但是,我还想要创建一个 mixin(或者可能是子类)CreateView 和 UpdateView 将 created_by 和 updated_by 设置为 self.request.user 在使用这些 CBV 的任何地方(我猜修改get_form() 或form_valid())。我还需要创建一个类似的管理 mixin 来修改 save_model()。
我从未创建过自定义 mixin,而且我发现/尝试过的东西都不起作用。例如,我通过修改 get_form() 使子类 CreateView 工作,但是我无法在我创建的各种 class ModelXCreate(...) 视图中进一步修改 get_form()。
有谁知道我如何做到这一点?能够拥有这样的 mixin 并保持 DRY 是非常有用的。
【问题讨论】:
标签: django django-models django-admin django-class-based-views