首页 > 解决方案 > Django - __str__ 返回非字符串(类型元组)

问题描述

我正在尝试从我的项目中打开模板 sem.html 和 year.html,但它显示了不必要的错误。早些时候它会顺利打开模板,但是当我尝试使用外键时,它会给出一个错误,即 str 返回了一个非字符串值。我正在加入我的 models.py 文件代码,在其中创建了两个名为 sem 和 year 的模型,在 forms.py 中,我创建了两个具有两个字段的表单 semforms 和 yearforms。

class subjects(models.Model):
    subject_code = models.CharField(max_length=20,null=True)
    subject_name = models.CharField(max_length=100,null=True)
    subject_abv = models.CharField(max_length=10,null=True)
    semester = models.IntegerField(null=True)
    theory_load = models.IntegerField(null=True)
    max_numb_students = models.CharField(max_length=65)
    faculty = models.ManyToManyField(facultyload)

    def __str__(self):
        return self.subject_code,self.subject_name

class semester(models.Model):
    sem_num = models.CharField(max_length=10,null=True)
    sem_courses = models.ManyToManyField(subjects,related_name='sem_courses')

    @property
    def get_courses(self):
        return self.sem_courses

    def __str__(self):
        return self.sem_num

class Year(models.Model):
    year_name = models.CharField(max_length=50)
    courses = models.ManyToManyField(subjects,related_name='courses')

    @property
    def get_courses(self):
        return self.courses

    def __str__(self):
        return self.year_name

表格.py

class semforms(forms.ModelForm):
    class Meta:
        model = semester
        fields = ['sem_num','sem_courses']

class yearforms(forms.ModelForm):
    class Meta:
        model = Year
        fields = ['year_name','courses']

它给出了这个错误

TypeError at /sem/
__str__ returned non-string (type tuple)
Request Method: GET
Request URL:    http://127.0.0.1:8000/sem/
Django Version: 3.1.4
Exception Type: TypeError
Exception Value:    
__str__ returned non-string (type tuple)

任何人都可以解决这个问题,请帮助。

views.py - (与年份功能相同,而不是我采用年份的 sem)

@login_required(login_url='login')    
@allowed_users(allowed_roles=['admin','customer'])
def sem(request):
    if request.method == 'POST':
        form = semforms(request.POST)
        if form.is_valid():
            try:
                form.save()
                return redirect('/sem')
            except:
                pass
    else:
        form = semforms()
    sem = semester.objects.all()
    total_sem = sem.count()
    context = {'sem':sem,'total_sem':total_sem,'form':form}
    return render(request,"sem.html",context)

@allowed_users(allowed_roles=['admin'])
def edit_sem(request, id):
    sem = semester.objects.get(id=id)
    return render(request,'editsem.html',{'sem':sem})

@allowed_users(allowed_roles=['admin'])
def update_sem(request, id):
    sem = semester.objects.get(id=id)
    form = semforms(request.POST,instance=sem)
    if form.is_valid():
        form.save()
        messages.success(request,"Record updated successfully......")
        return render(request,"editsem.html",{'sem':sem})

@allowed_users(allowed_roles=['admin'])
def delete_sem(request, id):
    load = semester.objects.get(id=id)
    load.delete()
    return render(request,'sem.html',{'load':load})

此外,这是我的完整 Traceback 错误。

Internal Server Error: /sem/
Traceback (most recent call last):
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Virti Parekh\projects\final\total_load\decorators.py", line 22, in wrapper_func
    return view_func(request, *args, **kwargs)
  File "C:\Users\Virti Parekh\projects\final\total_load\views.py", line 462, in sem
    return render(request,"sem.html",context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 170, in render
    return self._render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 988, in render
    output = self.filter_expression.resolve(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 671, in resolve
    obj = self.var.resolve(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 796, in resolve
    value = self._resolve_lookup(context)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\template\base.py", line 858, in _resolve_lookup
    current = current()
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\forms.py", line 297, in as_p
    errors_on_separate_row=True,
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\forms.py", line 236, in _html_output
    'field_name': bf.html_name,
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\utils\html.py", line 376, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\boundfield.py", line 34, in __str__
    return self.as_widget()
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\boundfield.py", line 97, in as_widget
    renderer=self.form.renderer,
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\widgets.py", line 241, in render
    context = self.get_context(name, value, attrs)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\widgets.py", line 678, in get_context
    context = super().get_context(name, value, attrs)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\widgets.py", line 639, in get_context
    context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\widgets.py", line 587, in optgroups
    for index, (option_value, option_label) in enumerate(self.choices):
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\models.py", line 1157, in __iter__
    yield self.choice(obj)
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\models.py", line 1171, in choice
    self.field.label_from_instance(obj),
  File "C:\Users\Virti Parekh\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\models.py", line 1240, in label_from_instance
    return str(obj)
TypeError: __str__ returned non-string (type tuple)

标签: djangodjango-modelsdjango-viewsdjango-templatesdjango-urls

解决方案


将您的主题类__str__方法更改为:

class subjects(models.Model):

    def __str__(self):
        return f"{self.subject_code},{self.subject_name}"

推荐阅读