2011-05-21 56 views
3

我有2種型號:Django:是否可以在一個通用視圖中驗證並保存多個表單的字段?

class Person(models.Model): 
    username = models.CharField 
    name = models.CharField(max_length = 30) 
    surname = models.CharFields(max_length = 30) 
    ... 

class PersonSkills(models.Model): 
    person = models.ForeignKey(Person) 
    skill = models.CharField(max_length = 30) 
    ... 

我想在一個視圖中的數據添加到個人和PersonSkills。

現在我有RegisterView喜歡下:

class RegisterForm(ModelForm): 
    class Meta: 
     model = Person 
     fields = ('username', 'name', 'surname', 'password',) 

class RegisterView(FormView): 
    form_class = RegisterForm 
    success_url = "/welcome/" 
    template_name = "register.tmpl" 
    is_valid = True 
    def form_valid(self, form):  
     form.save() 
     self.is_valid = True 
     return super(RegisterView, self).form_valid(form) 
    def form_invalid(self, form): 
     self.is_valid = False  
     return super(RegisterView, self).form_invalid(form) 
    ... 

所以,我怎麼能數據添加到個人和PersonSkills在一個視圖?從FormView繼承只允許一個form_class。

+0

還有一件事要注意。你爲什麼有一個人模型?這與contrib.auth.models.User模型中的內建幾乎完全相同。您應該在適當的地方使用用戶模型。 – 2011-05-21 07:31:45

回答

1

實現你想要的東西的最好方法是創建一個聲明兩個模型都需要的字段的自定義表單。通過訪問cleaned_data中的字段,使用表格的save方法保存到單個模型類。

然後你的FormView將按預期工作。它將接收兩種不同模型的輸入,但邏輯完全包含在表單中。與所有自定義表單一樣,將驗證邏輯放在各種方法中。

+0

不好意思。你的意思是手動聲明表單域(不使用捕捉到模型)像這樣:name = forms.CharField(max_length = 30)?在這種情況下,我們需要關心用戶名不唯一的情況。 – sergzach 2011-05-21 07:21:58

+0

@serg這絕對是我的意思。你可以使用表格的'clean_name'方法(假設該字段被稱爲name)來驗證該特定字段。您的問題目前不處理表單或模型中的唯一性,但它很容易烘烤。查看在模型字段聲明中使用'unique = True',以防止數據庫級別的無效數據,防止它滑倒通過應用程序 – 2011-05-21 07:30:19

相關問題