2014-06-30 58 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