You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里还有两处小问题:

  1. PersonFormView里的reverse_lazy没有赋值给success_url,导致创建成功后无法跳转;
  2. PersonFormView使用fields='__all__',没有关联你自定义的PersonForm,会忽略表单里的自定义配置。

修复步骤

  1. 修正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
    
  2. 修正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')
    
  3. 重启Django服务器,让修改生效。

完成以上操作后,表单中的courses字段就会正确显示课程标题,而非Object。

内容的提问来源于stack exchange,提问作者Gabriel Siahaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:43:25