在models.Model中會遇到 limit_choices_to ,這個是什麼意思呢?
在使用ModelForm渲染前端頁面的時候,當model字段為ForeignKey的時候,會被渲染成select單選框, model字段為ManyToMany的時候會被渲染成多選select款。
當你在model中FK字段或者M2M字段中加上 limit_choices_to選項的時候,前端頁面的渲染會根據你的限制條件來展示,這樣就達到來限制使用者選擇的目的
1 class ClassList(models.Model):
2 """
3 班級表
4 如:
5 Python全棧 面授班 5期 10000 2017-11-11 2018-5-11
6 """
7 school = models.ForeignKey(verbose_name='校區', to='School',on_delete=models.CASCADE)
8 course = models.ForeignKey(verbose_name='課程名稱', to='Course',on_delete=models.CASCADE)
9 semester = models.PositiveIntegerField(verbose_name="班級(期)") # PositiveIntegerField 正整數
10 price = models.PositiveIntegerField(verbose_name="學費")
11 start_date = models.DateField(verbose_name="開班日期")
12 graduate_date = models.DateField(verbose_name="結業日期", null=True, blank=True)
13 class_teacher = models.ForeignKey(verbose_name='班主任', to='UserInfo', related_name='classes',on_delete=models.CASCADE,limit_choices_to={'depart__title':'教質部'})
14 tech_teachers = models.ManyToManyField(verbose_name='任課老師', to='UserInfo', related_name='teach_classes', blank=True,limit_choices_to={'depart__title__in':
15 ['Python教學部','Linux教學部']})
16 memo = models.TextField(verbose_name='說明', blank=True, null=True)
17
18 def __str__(self):
19 return "{0}({1}期)".format(self.course.name, self.semester)
# 上述class_teacher中limit_choices_to={'depart__title':'教質部'},表明選擇班主任隻能在關聯班主任的外鍵表depart中名稱為教質部的資料;
# 同時tech_teachers中 limit_choices_to={'depart__title__in':['Python教學部','Linux教學部']},表明選擇任課老師隻能在關聯任課老師的M2M表UserInfo中名稱為Python教質部或Linux教學部的資料;