HTML 中未呈现 Django 形式
Django-form not rendered in HTML
**renders**
的观点是
def codequestion(request, question_id):
question = Question.objects.get(pk=question_id)
return render(request, 'polls/codequestion.html', {'question': question})
提交时调用的视图是
def codequestion_evaluate(request, question_id):
form = CodeForm()
print request.method
if request.method == 'POST':
form = CodeForm(request.POST)
if form.is_valid():
data = form.cleaned_data
return HttpResponse("Your code is %s" % data['solution'])
else:
return HttpResponse("not valid")
else:
return HttpResponse("Error")
class
from django import forms
class CodeForm(forms.Form):
solution = forms.CharField(widget=forms.Textarea)
模板
<form action="{% url 'codequestion_evaluate' question.id %}" method="post">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Submit" />
</form>
我在HTML页面中没有显示表单字段,我只能看到提交按钮。
本应显示未填写表单的视图根本不创建表单对象。它应该创建一个表单对象并将其传递给模板,如下所示:
def codequestion(request, question_id):
question = Question.objects.get(pk=question_id)
form = CodeForm()
return render(request, 'polls/codequestion.html', {'question': question, 'form': form})
但更好的是你应该遵循 the pattern described in Django documentation。为此,您应该:
删除codequestion
。所有操作(显示未填写的表单、显示提交的有错误的表单、处理正确提交的表单)都将由单个视图处理。
配置您的 url 路由,以便 codequestion_evaluate
视图处理显示未填写表单的页面。
更改 codequestion_evaluate
使其遵循以下模式:
def codequestion_evaluate(request, question_id):
if request.method == 'POST':
form = CodeForm(request.POST)
if form.is_valid():
# The form has been submitted and is valid
# process the data and redirect to a "thank you" page
data = form.cleaned_data
return HttpResponseRedirect('/thanks/')
else:
# just display an empty form
form = CodeForm()
# you can optionally add 'question' if you need it in your template
question = Question.objects.get(pk=question_id)
return render(request, 'polls/codequestion.html', {'form': form, 'question': question})
form
指的是你上下文数据中的一个变量,因为你没有把它包含在上下文数据中,它找不到它所以没有任何东西可以渲染,你需要包含它。
def codequestion(request, question_id):
question = Question.objects.get(pk=question_id)
return render(request, 'polls/codequestion.html',
{'question': question, 'form': CodeForm()})
尝试改变
class CodeForm(forms.Form):
至
class CodeForm(forms.ModelForm):
我遇到了同样的问题,但已经解决了。
django
的最新发行版不包含小部件。所以:
pip install django-widgets
应该可以解决问题。
**renders**
的观点是
def codequestion(request, question_id):
question = Question.objects.get(pk=question_id)
return render(request, 'polls/codequestion.html', {'question': question})
提交时调用的视图是
def codequestion_evaluate(request, question_id):
form = CodeForm()
print request.method
if request.method == 'POST':
form = CodeForm(request.POST)
if form.is_valid():
data = form.cleaned_data
return HttpResponse("Your code is %s" % data['solution'])
else:
return HttpResponse("not valid")
else:
return HttpResponse("Error")
class
from django import forms
class CodeForm(forms.Form):
solution = forms.CharField(widget=forms.Textarea)
模板
<form action="{% url 'codequestion_evaluate' question.id %}" method="post">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Submit" />
</form>
我在HTML页面中没有显示表单字段,我只能看到提交按钮。
本应显示未填写表单的视图根本不创建表单对象。它应该创建一个表单对象并将其传递给模板,如下所示:
def codequestion(request, question_id):
question = Question.objects.get(pk=question_id)
form = CodeForm()
return render(request, 'polls/codequestion.html', {'question': question, 'form': form})
但更好的是你应该遵循 the pattern described in Django documentation。为此,您应该:
删除
codequestion
。所有操作(显示未填写的表单、显示提交的有错误的表单、处理正确提交的表单)都将由单个视图处理。配置您的 url 路由,以便
codequestion_evaluate
视图处理显示未填写表单的页面。更改
codequestion_evaluate
使其遵循以下模式:def codequestion_evaluate(request, question_id): if request.method == 'POST': form = CodeForm(request.POST) if form.is_valid(): # The form has been submitted and is valid # process the data and redirect to a "thank you" page data = form.cleaned_data return HttpResponseRedirect('/thanks/') else: # just display an empty form form = CodeForm() # you can optionally add 'question' if you need it in your template question = Question.objects.get(pk=question_id) return render(request, 'polls/codequestion.html', {'form': form, 'question': question})
form
指的是你上下文数据中的一个变量,因为你没有把它包含在上下文数据中,它找不到它所以没有任何东西可以渲染,你需要包含它。
def codequestion(request, question_id):
question = Question.objects.get(pk=question_id)
return render(request, 'polls/codequestion.html',
{'question': question, 'form': CodeForm()})
尝试改变
class CodeForm(forms.Form):
至
class CodeForm(forms.ModelForm):
我遇到了同样的问题,但已经解决了。
django
的最新发行版不包含小部件。所以:
pip install django-widgets
应该可以解决问题。