2011-09-12 82 views
3

Django表單如果我有Django應用兩種模式是這樣的:基於多模型

class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField(max_length=100) 

如何創建一個表單,允許您添加既是AuthorBook同時進行。如果作者存在於系統中,我可以簡單地顯示書籍表格並將其鏈接到作者,但通常我需要允許用戶同時創建書籍和作者。

我該怎麼做?

謝謝。

+0

您可以爲用戶提供選擇作者或創建新作者的選項,然後使用Ajax調用創建新作者並修改列表以包含新創建的作者。如果這聽起來很有趣,那麼我可以提供更多信息。 –

+0

我想過類似的實現,埃德,但我想盡可能保持它作爲Djangoic。使用AJAX方法,我不認爲我可以使用Django的通用CRUD視圖。 –

+0

@MridangAgarwalla ...你還記得最後你是如何實現它的嗎?我有一個類似的問題,我需要在管理頁面的一個模型中添加兩​​個模型。你的解決方案可能會幫助我謝謝。 – ac11

回答

4

您可以編寫一個自定義表單,它將檢查作者是否存在於系統中使用現有的,如果不存在,用所提供的名稱創建新的。

class CustomForm(forms.ModelForm): 
    author = forms.CharField() 

    def save(self, commit=True): 
     author, created = Author.objects.get_or_create(name=self.cleaned_data['author']) 

     instance = super(CustomForm,self).save(commit=commit) 
     instance.author = author 
     if commit: 
      instance.save() 
     return instance 

    class Meta: 
     model=Book 

不確定此代碼是否正常工作,但我想它可以解釋我的想法。

+0

添加meta class with model = Book – szaman

+0

嗨德米特里。這個解決方案適用於只有一個字段的示例情況。我只是以此爲例。當我的作者模型有很多字段時,我必須在ModelForm中編寫每個字段。我正在尋找一種基於兩種形式直接創建ModelForm的方法,需要重新聲明所有字段。謝謝。 –