我正在Django中编写一个通用的CreateView,并使用文档中的这个示例。
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreate(SuccessMessageMixin, CreateView):
model = Author
success_url = '/success/'
success_message = "%(name)s was created successfully"
如果成功消息(名称)中的字段未处理并从表单中按原样保存,则此操作正常。如果我试图输出类似的东西
success_message = "%(id)s was created successfully"
其中我在Model上调用的自定义保存方法中处理保存id,它抛出一个关键错误。这不是很糟糕吗?成功消息不是应该在成功保存后创建,而不是form_valid
吗?
成功消息的form_valid
方法在实例保存后调用。但是,成功消息是使用表单的cleaned_data
而不是模型实例构建的。这允许mixin与所有表单一起使用,而不仅仅是模型表单。
用于在基于类的视图中添加消息的Django文档解释了要做什么——覆盖get_success_message
,而不是设置success_message
属性。
class AuthorCreate(SuccessMessageMixin, CreateView):
def get_success_message(self, cleaned_data):
return "%(id)s was created successfully" % {'id': self.object.id}