簡體   English   中英

django-CreateView不創建模型

[英]django - CreateView to not create a model

我有一個用於創建用戶的自定義create_user()方法,但我想轉到CreateView視圖。

在創建用戶之前,我需要提供一些其他參數,並且需要創建用戶對象來進行更多處理(發送電子郵件)等。

如何在CreateView中操縱對象的創建。 我可以將我的create_user方法放入視圖的form_valid方法中,但隨后return super(UserCreate, self).form_valid(form)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__'

我通過查看CreateView工作原理弄清楚了。

傳入的請求由ProcessFormViewpost()方法處理,該方法調用get_form_class()get_form() 后一種方法處理POST請求,因此,FormMixin中的get_form_kwargs get_form_kwargs()代碼將提交的數據添加到關鍵字字典中。

現在,表單已綁定(即,它包含用戶提供的數據或文件),並且post()方法現在測試is_valid()的結果,並相應地調用form_valid()或form_invalid()。

FormMixin類將form.save()的結果放入self.object 用於form.save()方法由BaseModelForm定義,並且基本上保存與BaseModelForm連接的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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM