Пиша, следователно съм.

modelform

Абонирайте се за този блог

Следвайте по имейл

Филтрирайте избора на полето ManyToMany в Django ModelForm

  • Вземете връзка
  • Facebook
  • Twitter
  • Pinterest
  • електронна поща
  • Други приложения

В настоящия ми проект се изисква да създам форма, в която определена група потребители може да създава само с определен вид данни. Например:

  • Потребител 1 от група А може да създава обекти на учител само с набор от ученици (номер на ученик, да кажем ['123', '234'])
  • Потребител 2 от група Б може да създава обекти на учител само с набор от ученици (students_numbers, ['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.student_name

клас Meta:
поръчка = ['студент_номер']


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

def __unicode __ (самостоятелно):
върнете u '% s'% (self.name)

клас Мета:
подреждане = ['име']
verbose_name = "Учители"

За да мога да генерирам формуляр и филтър по student_number, просто трябва да дефинирам функцията си __init__ за TeacherForm:

от django.forms импортиране на ModelForm
от myapps.models внос Учител, Студент

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

def __init __ (self, student_set, * args, ** kwargs):
супер (TeacherForm, самостоятелно) .__ init __ (* args, ** kwargs)
self.fields ['students']. queryset = Student.objects.filter (student_number__in = student_set)

клас Meta:
модел = Учител
полета = ['name', 'students']
изключване = []

И така, в изгледа първо проверявам потребителската група, за да реша от кой набор ученици този потребител може да създава, след което го предавам на екземпляра на формуляра: