我有一个用于创建用户的自定义create_user()
方法,但我想转而转到CreateView
视图。
我需要在创建用户之前提供一些额外的参数,并且需要创建用户对象以进行更多处理(发送电子邮件)等。
如何在CreateView中操作对象创建。我可以将create_user
方法放在视图的form_valid
方法中,但是我将返回什么(return super(UserCreate, self).form_valid(form)
)将创建一个新对象。
class UserCreate(generic.CreateView):
model = User
template_name = 'crm2/create_user.html'
fields = ['email', 'username', 'namespaces']
success_url = reverse_lazy('crm2:userCreate')
def form_valid(self, form):
user = create_user(self.request.POST['username'],
self.request.POST['email'], str(uuid4()),
self.request.POST['namespaces'])
reset_link = get_reset_link(user)
send_mail_set_password(user, reset_link)
return HttpResponseRedirect(self.get_success_url())
[[create_user
需要username
,email
,password
,namespaces
]]
错误是:'NoneType' object has no attribute '__dict__'
答案 0 :(得分:1)
我通过查看CreateView
的工作原理来解决这个问题。
传入请求由post()
ProcessFormView
方法处理,该方法调用get_form_class()
和get_form()
。后一种方法处理POST请求,因此FormMixin中的get_form_kwargs()
代码会将关键字字典添加到提交的数据中。
现在表单已绑定(即,它包含用户提供的数据或文件),post()
方法现在测试is_valid()的结果,并相应地调用form_valid()或form_invalid()。< / p>
FormMixin类将form.save()
的结果放入self.object
。模型的form.save()
方法由BaseModelForm
定义,基本上保存了与modelform连接的Django模型的实例,即在CreateView
表单视图的基础上实现实际创建。当form.save()
返回保存到数据库的对象时,将其存储在self.object
中并将其传递给模板是有意义的。
因此,
class UserCreate(generic.CreateView):
model = User
template_name = 'crm2/create_user.html'
fields = ['email', 'username', 'namespaces']
success_url = reverse_lazy('crm2:userCreate')
def get_form(self, form_class):
form = super(UserCreate, self).get_form(form_class)
return form
def form_valid(self, form):
self.object = create_user(self.request.POST['username'],
self.request.POST['email'], str(uuid4()),
self.request.POST['namespaces'])
reset_link = get_reset_link(self.object)
send_mail_set_password(self.object, reset_link)
return HttpResponseRedirect(self.get_success_url())