2013-07-20 67 views
0

我想要做的是這樣的:處理數據通過創建視圖

1)我創建模型

class Example(models.Model): 

    username = models.CharField(max_lenght=111) 
    pass = models.CharField(max_lenght=111) 

2)我創建形式使用的ModelForm,並添加一個額外的場

class ExampleForm(ModelForm): 

    extra_field= form.CharField(max_length=333) 

    class Meta: 
     model = Client 
     fields = ['username', 'pass'] 

3)我創建的視圖來處理這種形式

class Registration(CreateView): 
    """ 
    View handles user registration. 
    """ 
    form_class = ExampleForm 
    model = Example 
    template_name = 'accounts/registration.html' 
    success_url = reverse_lazy('accounts:registered') 

現在我想要做的是做一些extra_field的自定義處理。我發現這應該在ExampleForm的保存方法中完成。例如:

def save(self, commit=True): 

     user = super(ExampleForm, self).save(commit=False) 
     data = self.cleaned_data['extra_field'] 
     user.set_password(self.cleaned_data['pass'] + self.cleaned_data['extra_field']) 

     if commit: 
      user.save() 
     return user 

但這不起作用。 這是處理這種情況的正確方法,還是有更好的辦法? 最大的問題是,這不是我的代碼,所以我應該只更改ExampleForm。 有沒有辦法做到這一點?

在此先感謝。

最好的問候, 尼古拉

+0

什麼不工作?你能詳細說明嗎? – karthikr

+0

那麼,現在我已經用extra_field = form.CharField()試過了,它可以工作。 我需要的是ImageField()。 註冊視圖永遠不會返回帳戶:註冊模板,並且從不在數據庫中創建用戶(示例)。 – Nezzit

回答

1

可以在CreateViewform_valid()方法做到這一點。

class Registration(CreateView): 
    """ 
    View handles user registration. 
    """ 
    form_class = ExampleForm 
    model = Example 
    template_name = 'accounts/registration.html' 
    success_url = reverse_lazy('accounts:registered') 

    def form_valid(self, form): 
     example = form.save(commit=False) 
     example.extra_field = derive_data(form.cleaned_data) 
     example.save() 
     return super(Registration, self).form_valid(form) 
+0

是的,這工作。 – Nezzit