2017-08-03 60 views
0

我對課堂的模型和學生如下圖所示如何通過ModelForm ForeignKey創建模型對象?

class Classroom(models.Model): 
    COURSE_NAME = (
     ('MA8', 'Math 8'), 
     ('SC10', 'Science 10'), 
     ('PH11', 'Physics 11'), 
     ('PH12', 'Physics 12'), 
    ) 
    BLOCK_NUMBER = (
     ('11', 'Block 1-1'), 
     ('12', 'Block 1-2'), 
     ('13', 'Block 1-3'), 
     ('14', 'Block 1-4'), 
     ('21', 'Block 2-1'), 
     ('22', 'Block 2-2'), 
     ('23', 'Block 2-3'), 
     ('24', 'Block 2-4'), 
    ) 
    class_list = models.TextField() 
    course_name = models.CharField(max_length=20, choices=COURSE_NAME) 
    course_block = models.CharField(max_length=10, choices=BLOCK_NUMBER) 


class Student(models.Model): 
    classroom = models.ForeignKey(Classroom, on_delete=models.CASCADE) 
    nickname = models.CharField(default='JohnS', max_length=31) 
    attend = models.BooleanField(default=True) 

我創建了一個表格課堂。 class_list和TextField是用戶複製/粘貼名稱列表的地方。然後我想解析class_list並將每個單獨的名稱保存爲nickname。我第一次嘗試以下,但這似乎並沒有保存學生對象。

forms.py 
class ClassroomForm(ModelForm): 
    class Meta: 
     model = Classroom 
     fields = ['course_name', 'course_block','class_list'] 

views.py 
class ClassroomCreateView(CreateView): 
    model = Classroom 
    form_class = ClassroomForm 

    def form_valid(self, form): 
     classroom = form.save(commit=False) 
     s = Student() 
     for line in classroom.class_list: 
      s.nickname = line 
      s.save() 
     classroom.save() 
     return super(ClassroomCreateView, self).form_valid(form) 
    def get_success_url(self): 
     return reverse('classroom:submitted') 

我還試圖創建StudentForm,其允許用戶選擇course_namecourse_block(其對應於特定class_list)。窗體或視圖將創建單獨的Student對象並顯示它們。我閱讀了ModelChoiceField,但我無法弄清楚如何實現這一點。

如何以及在哪裏(自動)從ForeignKey字段創建學生對象?

回答

0

我用help of this answer解決了我的問題。這是我用於models.py的修改後的代碼。我的觀點只是ModelForm的一個標準的CreateView。

class Classroom(models.Model): 
    ... dictionary stuff .. 
    class_list = models.TextField() 
    course_name = models.CharField(max_length=20, choices=COURSE_NAME) 
    course_block = models.CharField(max_length=10, choices=BLOCK_NUMBER) 
    group_size = models.IntegerField(default=3) 

    def __str__(self): 
     return self.get_course_block_display() 

    def save(self, *args, **kwargs): 
     super(Classroom, self).save(*args, **kwargs) 
     # overrides the default save function to parse the class list 
     studentList = [] 
     studentList = self.class_list.split('\n') 
     for line in studentList: 
      line = line.strip('\r') 
      s = Student.objects.create(nickname = line, classroom = self) 
相關問題