add_message() 参数必须是 HttpRequest 对象,而不是 'str'。

3

我目前正在开发一个Django网站,它可以将DNA链翻译成蛋白质。基本上,您输入一组可被三整除的字母,然后它就会被翻译成蛋白质。这部分代码完美地运行着。然而,我在消息方面遇到了一些麻烦。如果您想查看Django消息的文档,请点击此处:https://docs.djangoproject.com/en/3.1/ref/contrib/messages/

我的目标是:当您输入的字母组不可被三整除时,应该会引发一个带有错误级别的消息(message.error)。以下是代码:

class TranslatorView(View):
    def translate_amino(self, codon):
        return self.amino_mapper.get(codon, "")


   

    def build_protein(self, request, phrase):
        protein = []
        i = 0
        while i < len(phrase):
            codon = phrase[i: i + 3]
            amino = self.translate_amino(codon)
            if amino:
                protein.append(amino)
            else:
                print(f"The codon {codon} is not in self.mapper_1")
            i += 3
        if len(phrase) % 3:
            messages.error(request, 'DNA CHAIN INVALID')
        else:
            return protein
    


    

    def get(self, request, *args, **kwargs):
        return render(request, 'main/translator.html')

    def post(self, request, *args, **kwargs):
        phrase = request.POST.get('text', 'translation')
        protein = request.POST.get('text','protein')
        return render(request, self.template_name, {'translation': self.translate(phrase), 'protein': ", ".join(self.build_protein(protein, phrase))})

    

然而,当我运行代码时,会出现以下错误:

add_message() 的参数必须是 HttpRequest 对象,而不是 'str'。

        return render(request, self.template_name, {'translation': self.translate(phrase), 'protein': ", ".join(self.build_protein(protein, phrase))}) …
▶ Local vars
C:\Users\marcv\OneDrive\Escriptori\Translate\Scripts\src\translator\views.py, line 176, in build_protein
            messages.error(request, 'DNA CHAIN INVALID') 

我相信这是来自于if语句中我输入的message.error。

然而,我不知道如何解决它。

附注:如果您需要调用方法,请告诉我。


请发布完整的回溯信息。 - Willem Van Onsem
我刚刚编辑了帖子,并附上了完整的回溯信息。 - Marcgames_YT
这不是回溯,而是视图。回溯列出了导致错误的所有方法调用,以及参数的值。 - Willem Van Onsem
哦,抱歉,是我的错。 - Marcgames_YT
现在,这里是回溯信息。它说错误出现在messages.error行和调用的post方法中。 - Marcgames_YT
好的,问题解决了。现在出现了另一个错误,不过我相信我知道解决方法。无论如何,非常感谢。 - Marcgames_YT
2个回答

1

你可以通过以下方式进行函数调用:

'protein': ', '.join(self.build_protein(protein, phrase))

这意味着def build_protein(self, request, phrase)的第二个参数不是请求对象,而是protein的值。你应该传递请求,如下所示:
'protein': ', '.join(self.build_protein(<b>request</b>, phrase))

在您的build_protein(…)方法中,如果条件未满足,最好也返回一个值,因为如果该方法返回None''.join(None)将会引发错误:
def build_protein(self, request, phrase):
    protein = []
    i = 0
    while i < len(phrase):
        codon = phrase[i: i + 3]
        amino = self.translate_amino(codon)
        if amino:
            protein.append(amino)
        else:
            print(f'The codon {codon} is not in self.mapper_1')
        i += 3
    if len(phrase) % 3:
        messages.error(request, 'DNA CHAIN INVALID')
        <b>return ()</b>
    else:
        return protein

@Marcgames_YT:不,你需要将build_protein(protein, phrase)替换为build_protein(request, phrase),因为第一个参数(如果你计算self则是第二个参数)是request而不是protein - Willem Van Onsem
我相信这解决了我的错误。谢谢。 - Marcgames_YT

0

我相信你的错误源于你的错误信息(正如你所正确识别的)。消息函数的第一个参数必须是HTTP请求。这似乎表明你的'request'不符合该标准。尝试用'self'替换请求。(如果您正在使用调试器,可以通过查询参数来确定哪个参数包含HTTP请求值进行验证)。即 messages.error(self,'DNA CHAIN INVALID')messages.error(self.request,'DNA CHAIN INVALID')具体取决于您的原始调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接