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。为此,您应该:

  1. 删除codequestion。所有操作(显示未填写的表单、显示提交的有错误的表单、处理正确提交的表单)都将由单个视图处理。

  2. 配置您的 url 路由,以便 codequestion_evaluate 视图处理显示未填写表单的页面。

  3. 更改 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

应该可以解决问题。