2016-03-02 5 views
0

У меня есть следующая форма в моем приложении django. Я перепробовал конструктор, чтобы я мог ограничить выбор, который появляется в поле «классы», так что появятся только классы, в которых участвуют ученики.Невозможно назначить - должен быть экземпляр

#forms.py 
class TestForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user', None) 
     super(TestForm, self).__init__(*args, **kwargs) 
     classes = [Classes.objects.filter(students__username=self.user.username)] 
     class_list = list() 
     for c in classes: 
      for single_class in c: 
       cl = Classes.objects.get(id=single_class.id) 
       class_list.append([cl, single_class]) 
     self.fields['classes'] = forms.ChoiceField(choices=class_list) 

    class Meta: 
     model = Test 
     fields = ('classes', 'name') 

Однако, делая это дает мне нельзя назначить «Class1234: Тест-класс» - «Test.classes» должен быть «Классы» экземпляр. Когда я печатаю class_list, я получаю это:

[[<Classes: Class1234: Test class>, <Classes: Class1234: Test class>],[<Classes: Testing: 2nd class>, <Classes: Testing: 2nd class>],[<Classes: 3rd: Class>, <Classes: 3rd: Class>]] 

Для меня, это будет выглядеть как фактические объекты класса, так что я не понимаю, почему это не работает. Для справки, вот мои модели и вид:

#models.py 
class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    teacher = models.BooleanField(default=False) 

    def __str__(self): 
     return "{0} {1}".format(self.user.first_name, self.user.last_name) 


class Classes(models.Model): 
    classcode = models.CharField(max_length=15) 
    classname = models.TextField() 
    students = models.ManyToManyField(User) 

    def __str__(self): 
     return "{0}: {1}".format(self.classcode, self.classname) 


class Test(models.Model): 
    classes = models.ForeignKey(Classes, on_delete=models.CASCADE) 
    name = models.TextField(max_length=100) 
    points = models.ManyToManyField(User, default=0) 

    def __str__(self): 
     return "{0}".format(self.name) 

#views.py 
def add_test(request): 
    added = False 
    form = TestForm(user=request.user) 
    if request.method == "POST": 
     form = TestForm(request.POST, user=request.user) 
     if form.is_valid(): 
      form.save() 
      added = True 
    return render(request, 'site/addtest.html', {'form': form, 'added': added}) 

ответ

1
[[<Classes: Class1234: Test class>, <Classes: Class1234: Test class>],[<Classes: Testing: 2nd class>, <Classes: Testing: 2nd class>],[<Classes: 3rd: Class>, <Classes: 3rd: Class>]] 

Это список списков, которые, вероятно, почему он терпит неудачу. Но в любом случае ваша проблема имеет гораздо более элегантное решение.

Не нужно делать это в __init__. Просто переопределите поле classes в вашей форме и задайте запрос. Узнайте больше об этом here.

И если это ограничение, которое должно применяться и на уровне базы данных, рассмотрите возможность использования limit_choices_to. Читайте об этом here.

+0

Спасибо за вашу помощь - именно то, что я искал – user2151557

Смежные вопросы