JeffD
JeffD

Reputation: 71

Django httpresponse is using get instead of post

Thank you for taking the time to help! I've been stuck for hours. I'm learning django by going through this fantastic youtube video: https://www.youtube.com/watch?v=sm1mokevMWk&t=4252s. I believe I copied the code from the video exactly, and I double and triple checked it. Yet, despite declaring method = "post" in "create".html django consistently uses a get response. WHY?!

#urls.py 
from django.urls import path
from . import views

urlpatterns = [
path('<int:id>', views.index, name='index'),
path("",views.home, name = 'home'),
path("create/", views.create, name="create"),
]





#views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .models import ToDoList, Item
from .forms import CreateNewList



def index(response, id):
    ls = ToDoList.objects.get(id=id)
    return render(response, 'main/list.html', {"ls":ls})



def home(response):
    return render(response, "main/home.html", {})

def create(response):
    print(response.method)
    if response.method == "POST":
        form = CreateNewList(response.POST)

        if form.is_valid():
            n = form.cleaned_data['name']
            t = ToDoList(name=n)
            t.save()
            return HttpResponseRedirect("/%i" %t.id)
    else:
        form = CreateNewList()
        return render(response, "main/create.html", {"form":form})








#create.html

{% extends 'main/base.html' %}

{% block title %} Create New List {% endblock %}

{% block content %}
Create Pages
<form method="post" action="/create/">
{{form.as_p}}
      <button type="submit", name ="save" >Create New</button>
</form>
{% endblock %}


#base.html
    <html>
<head>

    <title>{% block title %}Jeff's website{% endblock %}</title>
</head>

<body>
    <div id="content", name="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>



 #home.html
    
{% extends 'main/base.html'  %}

{% block title %}
Home
{% endblock %}


{% block content %}
<h1>Home Page</h1>
{% endblock %}



#models.py 
from django.db import models




class ToDoList(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

class Item(models.Model):
    todolist = models.ForeignKey(ToDoList, on_delete=models.CASCADE)
    text = models.CharField(max_length=300)
    complete = models.BooleanField()

    def __str__(self):
        return self.text


    

Upvotes: 0

Views: 618

Answers (1)

itjuba
itjuba

Reputation: 528

You need to perform a GET request first to display your form and then , you make a post request for the submit, that why you check the request method .

if response.method == "POST" => The form is already displayed and we need to submit it

else we need to display our form

Upvotes: 1

Related Questions