【问题标题】:Django multiselect choice AttributeError: 'str' object has no attribute 'status_code'Django多选选择AttributeError:'str'对象没有属性'status_code'
【发布时间】:2013-11-28 21:25:31
【问题描述】:

我在 models.py 中定义了一个类别的选择,它在 forms.py 中被引用,如下所示:

models.py

class Exp(models.Model):
    CATEGORIES = ( ('Inc', 'Inc'),\
                   ('Hom', 'Hom'),\
                   ('syn', 'Syn'),\
                   ('Was', 'Was')\
                 )

forms.py

class ExpForm(ModelForm):
    category = forms.MultipleChoiceField(choices=Exp.CATEGORIES, widget=forms.CheckboxSelectMultiple())
    class Meta:
        model = Exp

views.py

def view_exp(request):
    if request.method == "POST":
        form = ExpForm(request.POST)
        if form.is_valid():
        ...

多选选项在表单中正确显示,但是当我选择多个选项时,views.py 中的 form.is_valid() 返回 false 并出现 AttributeError: 'str' object has no attribute 'status_code 错误。我知道我得到的是 str 而不是 HttpResponse 对象,但不知道如何解决此错误。任何帮助表示赞赏。

注意:同一表单中还有其他类型为 CharField 的字段。

这是回溯:

Traceback (most recent call last):
  File "/software/python/python-2.7.3/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in get_response
    response = middleware_method(request, response)
  File "/software/python/python-2.7.3/lib/python2.7/site-packages/django/middleware/common.py", line 106, in process_response
    if response.status_code == 404:
AttributeError: 'str' object has no attribute 'status_code'

【问题讨论】:

  • 能否提供完整的回溯?
  • @mariodev,我用回溯更新了原始帖子,谢谢。
  • 是什么让您认为是 is_valid 方法导致了错误?这不是回溯显示的内容。实际上,错误是由您的视图返回字符串而不是 HttpResponse 引起的。
  • 感谢您指出错误。我仍然不明白为什么我得到一个字符串而不是 HttpResponse 对象!
  • @UNagaswamy - 您必须出示您的完整视图代码才能让我们弄清楚。

标签: django django-forms multi-select multichoiceitems


【解决方案1】:

感谢你们宝贵的 cmets 和早上一杯咖啡,我深入研究了我的代码。修复错误后我让它工作了。这是我在 models.py 中遇到的错误:

class Exp(models.Model):

    # The first element in each tuple is the actual value to be stored. The second element is the human-readable name for the option.
    CATEGORIES = ( ('Inc', 'Inc'),\
                 ('Clv','Clv'), \
                 ('Dys', 'Dys'), \
                 ('Hom', 'Hom'), \
                 ('Syn','Syn') )

    #category = models.CharField(max_length=100, choices=CATEGORIES) <--- culprit

我没有意识到我最初对类别的定义仍然存在。我在 models.py 中对此进行了评论,它按预期工作!

这是我的forms.py:

class ExpForm(ModelForm):
    category = forms.MultipleChoiceField(choices=Exp.CATEGORIES,widget=forms.CheckboxSelectMultiple())
    class Meta:
        model = Exp

这是我的views.py:

def view_experiment(request):
    if request.method == "POST":

        form = ExpForm(request.POST)
        if form.is_valid():
            picked = form.cleaned_data.get('category')
            category = ",".join([str(c) for c in picked])
            return HttpResponse("Multichoiceselect returned {0}".format(category))
        else:
            return "[ERROR] from views: {0}".format(form.errors)
    else:
        form = ExpForm()
    return render(request, 'template.html', {'form': form})

选择的多项选择作为 unicode 字符串列表返回。然后我将列表元素转换为字符串并用逗号将它们连接起来。

Also see this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多