2010-10-15 18 views
1

這實際上是previous question的後續行爲。如何在Django中以一對一關係將表單數據保存到不同模型中

用戶的配置文件數據分散在幾個不同的模式,像這樣:

# Simplified versions, actual classes contain many more fields. 

class Profile(models.Model): # returned by Django's User.get_profile() 
    user = models.OneToOneField(User) 

    home_address = models.OneToOneField(Address) 
    work_address = models.OneToOneField(Address) 

    language = models.CharField(max_length=20) 

class Address(models.Model): 
    street = models.CharField(max_length=100) 
    city = models.CharField(max_length=100) 

...和Django的User,當然。

我希望用戶在一個視圖中輸入所有他的個人資料數據,特別是這些信息:

  • 的用戶名(用戶)
  • 電子郵件(用戶)
  • 語言(簡介)
  • home_address.street(地址)
  • home_address.city(地址)
  • work_address.street(地址)
  • work_address.city(地址)

那麼,什麼是最簡單的/ Django的方式

  1. 構建這樣的形式?
  2. 在模板中輸出表單?
  3. 處理傳入的表單數據,將其分成不同的模型並創建必要的對象(即UserProfile和2 Address對象)?
+0

答案更新... – FallenAngel 2010-10-15 14:28:00

回答

0

最實際的辦法就是,我猜,使用的ModelForm表單集...

您可以使用模型的形式來創建從模型的形式。 Docs here .... 您可以使用內聯表單集來創建表單並輕鬆地保存數據... Doc here ...

但是,當然,相關的模型必須有外鍵到用戶或個人資料。你的模型結構可能不適合,因爲據我所知,內聯模型必須有一個外鍵到另一個外鍵,所以在這一點上,你的配置文件的外鍵需要在地址模型中......但正如我所說,我是不sure.you可以試一試......

既然你有適當的外鍵關係,你可以使用內聯表單集用的ModelForm創建從衆多車型形式...

編輯:

據我瞭解,您可以使用模型(無模板),並輕鬆地在模板中嵌入您的表單。但在處理髮布數據的視圖函數中,您必須手動設置外部一對一連接。像:

home = Address.objects.create(...) 
work = Address.objects.create(...) 
Profile.objects.create(home_address=home, work_address=work,...) 

或者你可以改變你的模型:

class Profile(models.Model): # returned by Django's User.get_profile() 
    user = models.OneToOneField(User) 
    language = models.CharField(max_length=20) 

class Address(models.Model): 
    profile = models.ForeignKey(Profile) 
    street = models.CharField(max_length=100) 
    city = models.CharField(max_length=100) 
+0

我已經查看了表單集和內聯表單集,它們看起來適用於分別具有多種對象類型,父對象以及多個子對象類型的情況。所以不,我不認爲他們在這裏幫助,因爲模型層次更復雜。 – anttikoo 2010-10-15 14:07:08

1

我覺得你點在哪裏modelforms表單集將需要更多的工作來定製比你會使用它們保存。因此,我會使用標準(非模型)表單,手動定義字段類型,並將其全部保存到相關模型中 - 無論是在視圖中,還是在表單上定義自己的save()方法並調用。

相關問題