2014-06-30 57 views
2

我想在我的模板中使用Django的ModelForm和内联表单。但是,我找不到任何将多个外键整齐映射到数据库模型的文档返回到同一个表。这是我的模型:Django内嵌表单与多个外键

# models.py 

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

class Majors(models.Model): 
    name = models.CharField(max_length=80) 

class Resumes(models.Model): 
    name = models.CharField(max_length=70) 
    undergrad = models.ForeignKey(Universities, related_name='undergrad_university') 
    undergrad_major = models.ForeignKey(Majors, related_name='undergrad_major') 
    grad = models.ForeignKey(Universities, related_name='grad_university') 
    grad_major = models.ForeignKey(Majors, related_name='grad_major') 

我怎么能有Django的生成提交简历,用户可以输入自己的大学名称和主要形式?在保存新简历之前,所有这四项都将用于在其各自的数据库中创建新条目(大学中有2个,专业中有2个),类似于inline formset example如何用于单一外键。

回答

0

编辑2:对于一个形式。我想我已经做了有)保存的压倒一切的(方法,像这样(forms.py)个性化的形式:

class YourForm(forms.Form): 
    fname = forms.CharField(label="name",max_length=70,validators=[#Choose your validators here]) 
    fundergrad = forms.CharField(label="fundergrad",max_length=100,validators=[#Choose your validators here]) 
    fundergrad_major = forms.CharField(label="fundergrad_major",max_length=80,validators=[#Choose your validators here]) 
    fgrad = forms.CharField(label="fgrad",max_length=100,validators=[#Choose your validators here]) 
    fgrad_major = forms.CharField(label="fgrad_major",max_length=80,validators=[#Choose your validators here]) 

    def save(self, datas): 
     res = Resumes() 
     res.name = datas['fname'] 

     undergrad = Universities() 
     undergrad_major = Majors() 
     grad = Universities() 
     grad_major = Majors() 

     undergrad.name = datas['fundergrad'] 
     undegrad_major.name = datas['fundergrad_major'] 
     grad.name = datas['fgrad'] 
     grad_major.name = datas['fgrad_major'] 

     undergrad.save() 
     undergrad_major.save() 
     grad.save() 
     grad_major.save() 

     res.undergrad = undergrad 
     res.undergrad_major = undergrad_major 
     res.grad = grad 
     res.grad_major = grad_major 

     res.save() 
     return res 

在views.py:

def formView(request) : 
    if request.method == 'POST': 
     form = YourForm(request.POST) 
     if form.is_valid(): 
      datas={} 
      datas['fundergrad']=form.cleaned_data['fundergrad'] 
      datas['fundergrad_major']=form.cleaned_data['fundergrad_major'] 
      datas['fgrad']=form.cleaned_data['fgrad'] 
      datas['fgrad_major']=form.cleaned_data['fgrad_major'] 

      form.save(datas) 

    #Then do what you have to do in your view 

EDIT1:(没有按“T回答的问题,但它可以帮助别人,也许只好让在这里)

我会在admin.py像这样尝试:

class UniversitiesInline1(admin.StackedInline): 
    model:Universities 
    fk_name = "undergrad" 

class UniversitiesInline2(admin.StackedInline): 
    model = Universities 
    fk_name = "grad" 

class MajorsInline1(admin.StackedInline): 
    model = Majors 
    fk_name = "undergrad_major" 

class MajorsInline2(admin.StackedInline): 
    model = Majors 
    fk_name = "grad_major" 

class ResumesAdmin(admin.ModelAdmin) 
    inlines = [ 
    UniversitiesInline1, 
    UniversitiesInline2, 
    MajorsInline1, 
    MajorsInline2, 
    ] 

admin.site.register(Resumes, ResumesAdmin) 

解释:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model

+0

啊我担心自定义保存自定义窗体将是唯一的解决方案(我开始在发布我的问题之前走相同的路线)。 ModelForms +内联表单的描述看起来完全适合,但我想这不适用于我的模型。我会在一两天内抛出问题,并希望在接受之前不是这样。我也会测试代码,并让它知道它是否有效。谢谢。 –

+0

实际上,自定义表单总是允许您更多的自由:显示样式,字段类型,字段小部件,验证器和自定义验证器,复杂验证(例如,如果您想检查它们之间的字段)。您可以使用自定义表单轻松完成所有操作,简单的Django表单不允许进行过多的自定义操作。 –

+0

当用户输入数据未正确验证时,此模式无法解决模型未能保存 – Jay