Fill out the form and save it in db base

Question:

I am working on a Django project and I want to fill out a form and save the data in the db database and then be able to show it on another page, I managed to create the form, following some tutorials, but it does not write me anything in the database. Here’s how I currently have things:

forms.py

    from django import forms
    from .models import AusenciasForm
    from django.contrib.auth.models import User
    
class AusenciasForm(forms.ModelForm):
    class Meta:
        model = AusenciasFormulario
        fields = '__all__'
        widgets = {'fecha': forms.DateInput(attrs={'type': 'date'})}

models.py

from django.db import models
from django.utils import timezone
import datetime
from django.contrib.auth.models import User
from django.urls import reverse
    
class AusenciasFormulario(models.Model):
    #razon = models.ModelChoiceField(label="Razón", queryset=razones.object.all())
    fecha = models.DateField(("Date"),default=datetime.date.today)#label="Fecha", required=True
    razon = [
        ('Estudios/Examen','Estudios/Examen'),
        ('Enfermedad','Enfermedad'),
        ('Lesión','Lesión'),
        ('Motivos personales','Motivos personales'),
        ('Motivos familiares','Motivos familiares'),
        ('Otros','Otros')
    ]
    motivo = models.CharField(max_length=100, choices=razon, default='Otros')
    comentarios= models.CharField(max_length=200,blank=True)
    jugador = User

views.py

class FormularioAusenciaView(HttpRequest):

    def index(request):
        ausencias_formulario =  AuForm.objects.all()
        return render(request, 'blog/ausencias.html', {'ausencias_formulario':ausencias_formulario})

    def procesar_formulario(request):
        #if request.method == 'POST':
            form = AusenciasForm(request.POST)
            if form.is_valid():
                form.save()
                form = AusenciasForm()
                return HttpResponseRedirect('ausencias/') #Add your route name, where you want to go after form save
            else:
                form = AusenciasForm()
            return render(request, 'blog/formularioAusencia.html', {'form':form})

Urls.py

from django.urls import path
from .views import PostListView, PostDetailView, PostCreateView, PostUpdateView, PostDeleteView,UserPostListView, FormularioAusenciaView, ausencias
from .import views
from django.contrib.auth.decorators import login_required

urlpatterns = [
    path('', login_required(PostListView.as_view()), name='blog-home'),
    path('user/<str:username>',login_required( UserPostListView.as_view()), name='user-posts'),
    path('post/<int:pk>/',login_required( PostDetailView.as_view()), name='post-detail'),
    path('post/new/',login_required( PostCreateView.as_view()), name='post-create'),
    path('post/<int:pk>/update/',login_required( PostUpdateView.as_view()), name='post-update'),
    path('post/<int:pk>/delete/',login_required( PostDeleteView.as_view()), name='post-delete'),
    path('about/', views.about, name='blog-about'),
    path('formularioAusencia/',login_required( FormularioAusenciaView.index), name='formularioAusencia'),
    #path('asistencia_done/',formularioAusencia, name='asistencia_done'),
    path('ausencias/',login_required( views.ausencias), name='ausencias'),
    
]

the template

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
    <div class="media">
      <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
      <div class="media-body">
        <h2 class="account-heading">{{ user.username }}</h2>
        <p class="text-secondary">{{ user.email }}</p>
      </div>
    </div>
    {% if user.is_authenticated %}
    <p></p><a class="mr-2">Rellenar si no vas a poder acudir a un próximo entrenamiento o partido</a></p>
    <!--<label><input type="checkbox" id="cbox1" value="first_checkbox"></label><br>-->
        <form method="POST" action="{% url 'ausencias' %}">{% csrf_token %}
          {{ form|crispy }}

          <button class="btn btn-danger btn-sm mt-1 mb-1" type="submit">Enviar</button>
        </form>
        </div>
        <div class="form-group">
        </div>
      {% endif %}
  </div>
{% endblock content %}
Asked By: Chema Torices

||

Answers:

In forms.py:

You have imported wrong model name:

change this

from .models import AusenciasForm

To this:

from .models import AusenciasFormulario

And in views.py file:
You have not added any orm query so that’s why it is not saving in db.

views.py :

Do this:

def index(request):
    ausencias_formulario =  AusenciasFormulario.objects.all() #Here i have retrieved data using orm
    return render(request, 'blog/formularioAusencia.html', {'ausencias_formulario':ausencias_formulario})

def procesar_formulario(request):
    if request.method == 'POST':
       form = AusenciasForm()
       if form.is_valid():
           form.save()
           return HttpResponseRedirect('/home/') #Add your route name, where you want to go after form save
    else:
         form = AusenciasForm()
    return render(request, 'blog/formularioAusencia.html', {'form':form})

And in your templates:

formularioAusencia.html

<form method='post'>
   {{form}}
  <input type="submit" />     #Added new code here
</form>

After submitting above form, using below code, you will get that fields.
Add below code after the form tag.

To display all the fields to templates add the below code in template:

{% for field in ausencias_formulario %}
   {{field.fecha}}
   #Add remaining fields here to display
{% endfor %}
Answered By: Manoj Tolagekar
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.