无法分配 - 必须是实例
Cannot assign - must be instance
我的 Django 应用程序中有以下表格。我覆盖了构造函数,因此我可以限制出现在字段 'classes' 中的选择,这样只有学生注册的 classes 才会出现。
#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 class" - "Test.classes" 必须是 "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>]]
对我来说,这确实看起来像实际的 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})
[[<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。
我的 Django 应用程序中有以下表格。我覆盖了构造函数,因此我可以限制出现在字段 'classes' 中的选择,这样只有学生注册的 classes 才会出现。
#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 class" - "Test.classes" 必须是 "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>]]
对我来说,这确实看起来像实际的 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})
[[<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。