Я зайнятий зміною світу

Я пишу, отже, є.

вибір

Підпишіться на цей блог

Слідуйте електронною поштою

Відфільтруйте вибір поля ManyToMany у формі Django ModelForm

  • Отримати посилання
  • Facebook
  • Twitter
  • Pinterest
  • Електронна пошта
  • Інші програми

У моєму поточному проекті мені потрібно створити форму, в якій певна група користувачів може створювати лише певний тип даних. Наприклад:

  • Користувач 1 групи A може створювати об'єкти вчителя лише з набором учнів (номер_учня, скажімо ['123', '234'])
  • Користувач 2 групи В може створювати об'єкти вчителя лише з набором учнів (студентські_номери, ['345', '678'])

Ось як виглядає модель:
models.py:

з моделей імпорту django.db

клас Студент(моделі. модель):
student_number = models.CharField (max_length = 6, primary_key = True)
student_name = models.CharField (max_length = 20)

def __unicode __ (self):
повернути self.student_name

клас Мета:
замовлення = ['номер_студента']


клас Вчитель(моделі. модель):
name = models.CharField (max_length = 50)
students = models.ManyToManyField (Student)

def __unicode __ (self):
повернути u '% s'% (self.name)

клас Мета:
упорядкування = ['ім'я']
verbose_name = "Вчителі"

Щоб мати можливість генерувати форму та фільтрувати за номером студента, мені просто потрібно визначити свою функцію __init__ для TeacherForm:

з django.forms імпортує ModelForm
з myapps.models імпорт Вчитель, Студент

клас Форма вчителя(ModelForm):

def __init __ (self, student_set, * args, ** kwargs):
super (TeacherForm, self) .__ init __ (* args, ** kwargs)
self.fields ['students']. queryset = Student.objects.filter (student_number__in = student_set)

клас Мета:
модель = Вчитель
поля = ['ім'я', 'студенти']
виключити = []

Отже, у поданні я спочатку перевіряю групу користувачів, щоб вирішити, з якого набору студентів цей користувач може створювати, а потім передаю її екземпляру форми: