2013-06-21 69 views
0

我有兩個模型,一個學生和一個代理。因爲學生模型有一些選擇領域,所以我使用FormForm作爲Form,這很好。每個學生都有一個代理:Django中的表格

class Student(models.Model): 
    ncode = models.CharField(max_length=12) 
    name = models.CharField(max_length=40) 
    family = models.CharField(max_length=60) 
    father = models.CharField(max_length=40) 
    telephone = models.CharField(max_length=18, blank=True) 
    address = models.CharField(max_length=256) 
    reagent = models.ForeignKey(Reagent) 
    state = models.IntegerField(choices=STUDYING_STATUS) 
    degree = models.IntegerField(choices=DEGREE_STATUS) 

class Reagent(models.Model): 
    name = models.CharField(max_length=40) 
    family = models.CharField(max_length=60) 
    telephone = models.CharField(max_length=18) 

這些形式:

class Student_Form(ModelForm): 
    class Meta: 
     model = Student 

class Reagent_Form(ModelForm): 
    class Meta: 
     model = Reagent 

但我刨去得到一個表格,以便雙方代理人和學生,我把它們放在一起以某種形式的模板:

<form action="" method="POST"> {% csrf_token %} 
    <table> 
     {{ student_form.as_table}} 
     {{ reagent_form.as_table }} 
    </table> 
    <input type="submit" value="Add"> 
</form> 

我的問題是我怎樣才能得到輸入的信息在單獨的學生和代理形式的實例? 如果在模板中只是一個表格信息我會用f = StudentForm(request.POST)!但形式混合在這種情況下

回答

1

你仍然可以做

f = Student_Form(request.POST) 
r = Reagent_Form(request.POST) 

和Django會指定相應的字段。

要隱藏FK場,

class Student_Form(ModelForm): 
    class Meta: 
     model = Student 
     exclude = ('reagent',) 

class Reagent_Form(ModelForm): 
    class Meta: 
     model = Reagent 

雖然保存在視圖中,

def myview(request): 
    reagent_form = Reagent_Form(prefix='reagent') 
    student_form = Student_Form(prefix='student') 
    if request.POST:    
     reagent_form = Reagent_Form(request.POST, prefix='reagent') 
        student_form = Student_Form(request.POST, prefix='student') 
     if reagent_form.is_valid() and student_form.is_valid(): 
      reagent = reagent_form.save() #first create the object 
      student = student_form.save(commit=False) 
      student.reagent = reagent #then assign to student. 
      student.save() 

     #rest of the code. 
+0

好,謝謝。還有一個問題:因爲學生和代理人之間的關係,它顯示了學生獲得代理人的選擇場。我怎麼能從用戶隱藏該字段? –

+0

剛剛編輯了這個問題。這可能會導致'name'字段出現問題,因此在創建表單時使用'prefix =「student」'或'prefix =「reagent」'這樣名稱就不會發生衝突。 – karthikr

+0

請注意,如果您創建了兩個表單並將它們呈現在同一個模板中,那麼您需要爲其中的一個使用'prefix'參數來避免名稱,家庭和電話域中的衝突他們分享。 https://docs.djangoproject.com/zh/dev/ref/forms/api/#prefixes-for-forms –