天天看點

Django當中models中的limit_choices_to

在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教學部的資料;