Error:'Answer' object has no attribute 'get'?
Error:'Answer' object has no attribute 'get'?
我正在使用 Django 1.11。
当我使用这段代码时,它对我有用,但是当我尝试添加新条件时,除了在这种情况下(否则),我收到此错误:
image
我想设置一个新条件来阻止任何人将(获取方法)放在我的页面上,怎么可能呢?
favourite.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Favourite Page</title>
<style>
input {padding: 8px;margin-top: 5px}
label {display: inline-block}
.input {display: inline-block}
</style>
</head>
<body>
{% if form_data %}
{{ form_data.question }}
{% else %}
<form action="{% url 'market:favourite' %}" method="post">
{% csrf_token %}
{% include 'market/template-form.html' %}
<input type="submit">
</form>
{% endif %}
</body>
</html>
views.py
def favourite(request):
context = {}
form = Answer
context['form'] = form
if request.method == 'POST':
form = form(request.POST)
if form.is_valid:
form.save(commit=False)
return render(request, 'market/favourite.html', {'form_data': form.cleaned_data})
else:
form = Answer()
return form
return render(request, 'market/favourite.html', {'form': form})<br>
forms.py
from .models import Question
from django import forms
class Answer(forms.ModelForm):
class Meta:
model = Question
fields = ['question']
models.py
CHOICE = [(1, 'Si'), (2, 'No')]
class Question(models.Model):
question = models.IntegerField(choices=CHOICE, default=1, blank=False)
核心问题是你return form
。您不能 return 表单作为视图函数的结果,它必须是 HttpResponse
对象。
也就是说,您的代码包含一些有点 "problematic":
的项目
- 最好使用
Form
后缀命名您的表单,否则您可以使用名为 Answer
; 的模型生成 "name clash"
- 您将对
Answer
的引用传递给上下文,而不是表单对象。如果发现表单无效,这很有用;
- 为了检查表单是否有效,您需要调用
is_valid()
method [Django-doc],而不是获取方法引用,因为它始终具有真实性True
;
- 如果表格有效,您可能希望提交结果,否则您的表格没有多大用处;
- 如果 POST 请求有效,您通常 return 一个 重定向 来实现 Post/Redirect/Get pattern [wiki];
- 你不需要对你的上下文做任何事情,因为你只是构造一个字典并将其作为上下文进行渲染。
更好的视图如下:
from django.shortcuts import redirect
def favourite(request):
if request.method == 'POST':
# rename Answer to AnswerForm
form = <b>AnswerForm(</b>request.POST<b>)</b>
if form.<b>is_valid()</b>: # call the method
form.<b>save()</b>
return <b>redirect(<i>'some-view-name'</i>)</b>
else:
form = <b>AnswerForm()</b>
return render(request, 'market/favourite.html', {'form': form})
此处您需要将 'some-view-name'
替换为要重定向到的视图名称,以防视图成功。
我正在使用 Django 1.11。
当我使用这段代码时,它对我有用,但是当我尝试添加新条件时,除了在这种情况下(否则),我收到此错误:
image
我想设置一个新条件来阻止任何人将(获取方法)放在我的页面上,怎么可能呢?
favourite.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Favourite Page</title>
<style>
input {padding: 8px;margin-top: 5px}
label {display: inline-block}
.input {display: inline-block}
</style>
</head>
<body>
{% if form_data %}
{{ form_data.question }}
{% else %}
<form action="{% url 'market:favourite' %}" method="post">
{% csrf_token %}
{% include 'market/template-form.html' %}
<input type="submit">
</form>
{% endif %}
</body>
</html>
views.py
def favourite(request):
context = {}
form = Answer
context['form'] = form
if request.method == 'POST':
form = form(request.POST)
if form.is_valid:
form.save(commit=False)
return render(request, 'market/favourite.html', {'form_data': form.cleaned_data})
else:
form = Answer()
return form
return render(request, 'market/favourite.html', {'form': form})<br>
forms.py
from .models import Question
from django import forms
class Answer(forms.ModelForm):
class Meta:
model = Question
fields = ['question']
models.py
CHOICE = [(1, 'Si'), (2, 'No')]
class Question(models.Model):
question = models.IntegerField(choices=CHOICE, default=1, blank=False)
核心问题是你return form
。您不能 return 表单作为视图函数的结果,它必须是 HttpResponse
对象。
也就是说,您的代码包含一些有点 "problematic":
的项目- 最好使用
Form
后缀命名您的表单,否则您可以使用名为Answer
; 的模型生成 "name clash"
- 您将对
Answer
的引用传递给上下文,而不是表单对象。如果发现表单无效,这很有用; - 为了检查表单是否有效,您需要调用
is_valid()
method [Django-doc],而不是获取方法引用,因为它始终具有真实性True
; - 如果表格有效,您可能希望提交结果,否则您的表格没有多大用处;
- 如果 POST 请求有效,您通常 return 一个 重定向 来实现 Post/Redirect/Get pattern [wiki];
- 你不需要对你的上下文做任何事情,因为你只是构造一个字典并将其作为上下文进行渲染。
更好的视图如下:
from django.shortcuts import redirect
def favourite(request):
if request.method == 'POST':
# rename Answer to AnswerForm
form = <b>AnswerForm(</b>request.POST<b>)</b>
if form.<b>is_valid()</b>: # call the method
form.<b>save()</b>
return <b>redirect(<i>'some-view-name'</i>)</b>
else:
form = <b>AnswerForm()</b>
return render(request, 'market/favourite.html', {'form': form})
此处您需要将 'some-view-name'
替换为要重定向到的视图名称,以防视图成功。