in Django : Why nothing happens when I try to Create new note with the html form in the notes.html page

Issue

I’ve just started my first app with Django by following a video on YouTube.
The app is a students dashboard with 8 tools and features to help the student to make note, search for help, save books, etc.

When I follow the steps I get stuck in the creation of a new note but note from the admin side but from the actual notes template that has a crispy form and a create button.
The program is supposed for writing a title and description (the content of the note) and then press the create button. When I try to click, nothing is happening.


#This is the view.py page in the dashboard app :

    from django.shortcuts import render
    from . forms import *
    from django.contrib import messages
    # Create your views here.
    
    
    def home(request):
        return render(request, 'dashboard/home.html')
    
    def notes(request):
        if request.method == "POST":
            form = NotesForm(request.POST)
            if form.is_valid():
                notes = Notes(user=request.user,title=request.POST['title'],description=request.POST['description'])
                notes.save()
            messages.success(request,f"Notes Added from {request.user.username} Successfully")
        else:
         form = NotesForm()
        notes = Notes.objects.filter(user=request.user)
        context = {'notes':notes,'form':form}
        return render(request,'dashboard/notes.html',context)

and this is the notes.html page in the dashboard app > template folder > dashboard folder :

{% extends 'dashboard/base.html' %}
<!-- Load the static files here -->
{% load static %} {% load crispy_forms_tags %}
<!-- loading the crispy files must be here so now i write anything to
     create some space and lines here we go baby lets add more -->
{% block content %}
<div class="container">
  <div class="row">
    {% for note in notes %}
    <div class="col-md-3">
      <a href="#">
        <div class="card">
          <div class="card-header">{{note.title}}</div>
          <div class="card-body">{{note.description|slice:"0:100"}}</div>
          <div class="card-footer mt-auto">
            <a href="#"> <i class="fa fa-trash fa-2x"></i></a>
          </div>
        </div>
      </a>
    </div>
    {% endfor %}
    <br /><br />
  </div>
</div>
<br /><br />
<div class="container">
  <form method="POST">
   {% csrf_token %}
    <fieldset class="form-group">
      <legend class="border-bottom mb-4">Create Notes</legend>
    </fieldset>
    {% crispy form %}
    <div class="form-group">
      <button href="" class="btn btn-outline-info" type="submit">Create</button>
    </div>
  </form>
</div>
{% endblock content %}

so, this the models.py file too

from django.db import models
from django.contrib.auth.models import User
# Create your models here.


class Notes(models.Model):
 user = models.ForeignKey(User, on_delete=models.CASCADE)
 title = models.CharField(max_length=200) 
 description = models.TextField() 
 def __str__(self):
   return self.title 
 class Meta:
   verbose_name = "notes" 
   verbose_name_plural = "notes"

in case the problem is not here, please take a look on the inside this forms.py

from dataclasses import fields
from django import forms
from . models import *

class NotesForm(forms.ModelForm):
  class Meta:
    model = Notes 
    fields = ['title', 'description']

and .. urls.py

from django.urls import path 
from . import views 


urlpatterns = [
    path('',views.home, name='home'), 
  path('notes',views.notes, name="notes")
]

Solution

There are many minor mistakes in the code:

  1. It is {{form|crispy}} to display the form not {% crispy form %}.

  2. You are also not using HttpResponseRedirect[django-doc] for redirecting, after saving form from POST data, you should always return an HttpResponse, its a good practice.

Try below code:

Notes.html

{% block content %}
{% load crispy_forms_tags %}

<div class="container">
<div class="row">
    {% for note in notes %}
    <div class="col-md-3">
    <a href="#">
        <div class="card">
        <div class="card-header">{{note.title}}</div>
        <div class="card-body">{{note.description|slice:"0:100"}}</div>
        <div class="card-footer mt-auto">
            <a href="#"> <i class="fa fa-trash fa-2x"></i></a>
        </div>
        </div>
    </a>
    </div>
    {% endfor %}
    <br /><br />
</div>
</div>
<br /><br />
<div class="container">
<form method="POST" action="{% url 'notes' %}" novalidate>
    {% csrf_token %}
    <fieldset class="form-group">
    <legend class="border-bottom mb-4">Create Notes</legend>
    </fieldset>
    {{form|crispy}}
    <input type="submit" value="Create">
</form>
</div>

{% endblock content %}

views.py


from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.shortcuts import render
from . forms import *
from django.contrib import messages
from django.urls import reverse


def home(request):
    return render(request, 'dashboard/home.html')


def notes(request):
    if request.method == "POST":
        form = NotesForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['title']
            descrip = form.cleaned_data['description']
            notes = Notes(
                user=request.user, title=title, description=descrip)
            notes.save()
            messages.success(
                request, f"Notes Added from {request.user.username} Successfully")
            return HttpResponseRedirect(reverse('thanks'))
    else:
        form = NotesForm()
    notes = Notes.objects.filter(user=request.user)
    context = {'notes': notes, 'form': form}
    return render(request, 'dashboard/notes.html', context)


def thanks(request):
    return render(request, 'dashboard/thanks.html')

urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('', views.home, name='home'),
    path('notes/', views.notes, name="notes"),
    path('thanks/', views.thanks, name='thanks')
]

thanks.html

<body>
    <h2>The form successfully submitted</h2>
</body>

Your forms.py can be remain same as it is.

Answered By – Sunderam Dubey

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published