【问题标题】:__str__ returned non-string (type tuple)__str__ 返回非字符串(类型元组)
【发布时间】:2016-10-05 21:26:04
【问题描述】:

我有一个表单在 django 中不断出现错误,我尝试在网上搜索我的模型上的 str() 但根本不起作用。谷歌搜索了几次,尝试了几种不同的方法,但每次单击表单的链接时,都没有奏效仍然得到相同的 django 错误页面。

TypeError: __str__ returned non-string (type tuple)

我的模特

# Injury Parameters -> SOI Level 2 #
####################################
class SourceOfInjuryLevel2(models.Model):
    creator = models.ForeignKey('auth.User')
    id = models.AutoField(primary_key=True)
    soi_l1 = models.CharField(max_length=80)
    soi_l2 = models.CharField(max_length=80)
    status = models.CharField(max_length=8)
    created_date = models.DateTimeField(default=timezone.now)
    modified_date = models.DateTimeField(blank=True, null=True)
    modified_by = models.CharField(max_length=60, blank=True, null=True)

    def create(self):
        self.save()

    def __str__(self):
        return self.soi_l1, self.soi_l2, self.status

我的表格

# Soure of Injury Level 2 #
###########################
class SourceOfInjuryLevel2Form(forms.ModelForm):
    options = (('Enabled', 'Enabled',), ('Disabled', 'Disabled'))
    soi_l1 = forms.ModelChoiceField(
            queryset=SourceOfInjuryLevel1.objects.filter(status='Enabled'),
            widget=forms.Select(attrs={'class': 'form-control'})
            )
    soi_l2 = forms.CharField(
            widget=forms.TextInput(attrs={'class': 'form-control'})
            )
    status = forms.CharField(
            widget=forms.Select(
                attrs={'class': 'form-control'},
                choices=options
                )
            )

    class Meta:
        model = SourceOfInjuryLevel2
        fields = ('soi_l1', 'soi_l2', 'status')

我的观点

# New Source of Injury Level 2 #
################################
def new_source_of_injury_level2(request):
    form = SourceOfInjuryLevel2Form()
    if request.method == "POST":
        form = SourceOfInjuryLevel2Form(request.POST)
        if form.is_valid():
            source_of_injury_level2 = form.save(commit=False)
            source_of_injury_level2.creator = request.user
            source_of_injury_level2.created_date = timezone.now()
            source_of_injury_level2.save()
            messages.success(request, 'Object Has Been Created')
            return redirect(injury_parameters)
        else:
            messages.error(request, 'Object Has Not Been Created')
    else:
        form = SourceOfInjuryLevel2Form()
    return render(request,
                  'process_injury_management/source_of_injury_level2.html',
                  {'form': form,
                   'title': 'New Source of Injury Level 2'})

【问题讨论】:

  • return self.soi_l1, self.soi_l2, self.status 不返回字符串,而是返回元组。您不能从 __str__ 返回元组。有什么地方可以改进错误消息以使其更清晰?

标签: python django


【解决方案1】:

错误在您的模型中:

class SourceOfInjuryLevel2(models.Model):

    ...

    def __str__(self):
        return self.soi_l1, self.soi_l2, self.status

我猜你很困惑,因为 Python 2 的 print 语句看起来像是将元组转换为字符串,但这实际上并不是 print 语句的工作方式 - 这是 Python 3 中更改的一个令人困惑的细节。

试试这个:

def __str__(self):
    template = '{0.soi_l1} {0.soi_l2} {0.status}'
    return template.format(self)

【讨论】:

    【解决方案2】:

    这些逗号实际上并没有像您认为的那样做。逗号使您的返回值成为 tuple 而不是 __str__ 方法应该返回的 string

    你可以这样做:

    def __str__(self):
        return '%s %s %s'%(self.soi_l1, self.soi_l2, self.status)
    

    或者使用新式格式:

    def __str__(self):
        return '{} {} {}'.format(self.soi_l1, self.soi_l2, self.status)
    

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2018-03-02
      • 1970-01-01
      • 2020-04-19
      • 2018-08-16
      相关资源
      最近更新 更多