Amon
Amon

Reputation: 2951

HttpResponse won't display `post` information when submitting a form

I'm working my way through Django and I'm creating an app that will allow users to use an ID number to sign-in to a system. So I have two views, one for users to log-in, and the other to sign-up. The former view works just fine, I can get it to display the information the user has submitted. However I can't get the second view to display the POST data to the user:

from .forms import NameForm, IdForm
from django.shortcuts import render
from django.http import HttpResponse

def sign_in(request):

    if request.method == "POST":
        #here will construct the form with the POST data
        form = NameForm(request.POST)
        #the next part is to check that the information submitted is valid
        if form.is_valid():
            post = form.save()
            post.save()
            return HttpResponse(post)
        else:
            return HttpResponse("Form is invalid")
    else:
        form = NameForm()
    return render(request, 'checkin/base.html', {'form': form})



def sign_up(request):
    if request.method == "POST":
        form = IdForm(request.POST)
        if form.is_valid():
            post = form.save()
            post.save()
            return HttpResponse(post)
        else:
            return HttpResponse('Form is invalid')
    else:
        form = IdForm()
    return render(request, 'checkin/base.html', {'form': form})

Basically I want to make the response to be "thank you, your ID number is: post".

Here is the class for my model:

from __future__ import unicode_literals

from django.db import models
from django import forms
from django.forms import ModelForm

# Create your models here.

class Question(models.Model):
    question_text = models.CharField("What is your ID?", max_length=200)

    id_text = models.CharField("Enter a new identification          
    number",max_length=200, null=True)

    def __str__(self):
        return self.question_text 

And here are the form classes for both views:

from django.forms import ModelForm
from .models import Question

#put the form here

class NameForm(ModelForm):
    class Meta:
        model = Question
        fields = ['question_text']

class IdForm(ModelForm):
    class Meta:
        model = Question
        fields = ['id_text']

Upvotes: 1

Views: 63

Answers (2)

e4c5
e4c5

Reputation: 53734

It's not generally acceptable to display the POST data as the respnose to the user. That's not HTML, merely a dictionary which the average user will not understand. The standard way of using forms in Django (and indeed almost any web framework) is to display the form validation errors to the user so that he may rectify it.

The right way

def sign_up(request):
    if request.method == "POST":
        form = IdForm(request.POST)
        if form.is_valid():
            post = form.save()
            post.save()
            return HttpResponseRedirect('/succes_url')
    else:
        form = IdForm()
    return render(request, 'checkin/base.html', {'form': form})

Upvotes: 2

Prakhar Trivedi
Prakhar Trivedi

Reputation: 8526

The problem is in line return HttpResponse(post),You are passing a whole form into HttpResponse,but as you mentioned,you just need id_text field of the IdForm. So the updated code should be :

def sign_up(request):
    if request.method == "POST":
        form = IdForm(request.POST)
        if form.is_valid():
            post = form.save()
            post.save()
            id = post.id_text
            return HttpResponse('thank you, your ID number is: '+id)
        else:
            return HttpResponse('Form is invalid')
    else:
        form = IdForm()
    return render(request, 'checkin/base.html', {'form': form})

Upvotes: 1

Related Questions