2011-09-12 50 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的方法,需要重新声明所有字段。谢谢。 –