django - CreateView不创建模型

时间:2016-07-13 10:05:50

标签: django

我有一个用于创建用户的自定义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需要usernameemailpasswordnamespaces]]

错误是:'NoneType' object has no attribute '__dict__'

1 个答案:

答案 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())