jayasurya_j
jayasurya_j

Reputation: 1617

Django-form not rendered in HTML

The view that **renders** is

def codequestion(request, question_id):
    question = Question.objects.get(pk=question_id)
    return render(request, 'polls/codequestion.html', {'question': question})

the view that is called on submission is

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)

template

<form action="{% url 'codequestion_evaluate' question.id %}" method="post">
{% csrf_token %}
{{form.as_p}}   
<input type="submit" value="Submit" />
</form>

I do not get the form field display in the HTML page, I can only see the submit button.

Upvotes: 3

Views: 4275

Answers (4)

curious_coder
curious_coder

Reputation: 1

The recent distributions of django don't have widgets included. So:

pip install django-widgets

should do the trick.

Upvotes: 0

prashant
prashant

Reputation: 3318

Try changing

class CodeForm(forms.Form):

to

class CodeForm(forms.ModelForm):

I faced same problem but it got resolved from this.

Upvotes: 0

Ludwik Trammer
Ludwik Trammer

Reputation: 25022

The view that is suppose to show the unfilled form doesn't create the form object at all. It should create a form object and pass it to the template, like this:

def codequestion(request, question_id):
    question = Question.objects.get(pk=question_id)
    form = CodeForm()
    return render(request, 'polls/codequestion.html', {'question': question, 'form': form})

But better yet you should follow the pattern described in Django documentation. To do this you should:

  1. Delete the codequestion. All actions (displaying the unfilled form, displaying a submitted form with errors, processing a correctly submitted form) will be handled by a single view.

  2. Configure your url routing so codequestion_evaluate view handles the page showing the unfilled form.

  3. Change codequestion_evaluate so it follows the pattern:

    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})
    

Upvotes: 2

Sayse
Sayse

Reputation: 43300

form refers to a variable in your context data, since you haven't included it in the context data, it can't find it so there isn't anything to render, you need to include it.

def codequestion(request, question_id):

    question = Question.objects.get(pk=question_id)
     return render(request, 'polls/codequestion.html',
                   {'question': question, 'form': CodeForm()})

Upvotes: 0

Related Questions