Django多对多表单未显示模型__str__内容,如何显示课程标题?
问题分析与解决
代码片段
Models.py
class Person(models.Model): name = models.CharField(max_length=128) email = models.EmailField(max_length=128, unique=True) courses = models.ManyToManyField('Course', through='Membership') def __str__(self): return self.email class Course(models.Model): title = models.CharField(max_length=128, unique=True) members = models.ManyToManyField(Person, through='Membership') def __str___(self): return self.title class Membership(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE) course = models.ForeignKey(Course, on_delete=models.CASCADE)
Form.py
class PersonForm(forms.ModelForm): class Meta: model = Person fields = ['name', 'email','courses'] courses = forms.ModelMultipleChoiceField( queryset=Course.objects.all(), widget=forms.CheckboxSelectMultiple)
Views.py
class CourseFormView(generic.CreateView): model = Course fields = ['title'] class PersonFormView(generic.CreateView): model = Person fields = '__all__' reverse_lazy('hello:cookie')
问题原因
表单中Course显示为Object的核心原因是Course模型的__str__方法定义错误:你写了__str___(三个下划线),而Django识别的是标准的__str__(两个下划线)。由于没有正确定义__str__,Django默认会输出对象的原始字符串表示(如<Course object (1)>),也就是你看到的Object。
另外Views.py里还有两处小问题:
PersonFormView里的reverse_lazy没有赋值给success_url,导致创建成功后无法跳转;PersonFormView使用fields='__all__',没有关联你自定义的PersonForm,会忽略表单里的自定义配置。
修复步骤
修正Course模型的
__str__方法:
修改Models.py中Course类的方法,把三个下划线改为两个:class Course(models.Model): title = models.CharField(max_length=128, unique=True) members = models.ManyToManyField(Person, through='Membership') def __str__(self): return self.title修正PersonFormView的配置:
修改Views.py,指定使用自定义表单并正确设置跳转地址:from django.urls import reverse_lazy from .forms import PersonForm class PersonFormView(generic.CreateView): model = Person form_class = PersonForm success_url = reverse_lazy('hello:cookie')重启Django服务器,让修改生效。
完成以上操作后,表单中的courses字段就会正确显示课程标题,而非Object。
内容的提问来源于stack exchange,提问作者Gabriel Siahaan
相关产品推荐
相关产品推荐

