Filtrează câmpul ManyToMany; Alegerile într-un model Django ModelForm
Scriu, de aceea sunt.

Abonați-vă la acest blog
Urmăriți prin e-mail
Filtrați opțiunile câmpului ManyToMany într-un model Django ModelForm
- Obține link
- Stare de nervozitate
- Alte aplicatii
În proiectul meu actual, sunt obligat să construiesc un formular în care un anumit grup de utilizatori să poată crea numai cu un anumit tip de date. De exemplu:
- Utilizatorul 1 al grupului A poate crea obiecte de profesor doar cu un set de studenți (student_numbers, să zicem ['123', '234'])
- Utilizatorul 2 al grupului B poate crea obiecte profesor numai cu un set de studenți (student_numbers, ['345', '678'])
Iată cum arată modelul:
models.py:
din modele de import django.db
clasă Student(modele. Model):
student_number = models.CharField (max_length = 6, primary_key = True)
student_name = models.CharField (max_length = 20)
def __unicode __ (auto):
returnează auto.student_name
clasa Meta:
ordering = ['student_number']
clasă Profesor(modele. Model):
name = models.CharField (max_length = 50)
studenti = models.ManyToManyField (Student)
def __unicode __ (auto):
returnează '% s'% (self.name)
clasa Meta:
ordering = ['nume']
verbose_name = "Profesori"
Pentru a putea genera un formular și filtra după numărul_student, trebuie doar să-mi definesc funcția __init__ pentru TeacherForm:
din django.forms import ModelForm
din myapps.models import Profesor, student
clasă TeacherForm(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)
clasa Meta:
model = Profesor
câmpuri = ['nume', 'studenți']
exclude = []
Deci, în vizualizare, verific mai întâi grupul utilizatorului pentru a decide din ce set de studenți poate crea acel utilizator, apoi îl transmit instanței formularului: