'How do I update the records stored in my db using an html form as input?

I am very new to django and I have made an app that displays a different timetable for different user. I am stuck at this point where I can delete the records stored in my db but I am unable to update them through my html form. Is there a way to do this?

Here are my files,

models.py

from pickle import TRUE
from django.db import models
from datetime import date
from django.conf import settings

class Timetable(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default = "", on_delete=models.CASCADE)
    subject = models.CharField(max_length=100)
    room_no= models.IntegerField()
    date = models.DateField(default=date.today)
    time = models.TimeField()
    semester = models.TextField()
    day = models.CharField(max_length=10, default="")

views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm
from django.contrib.auth.decorators import login_required
from .models import Timetable

# Create your views here.

def register(request):
    if request.method=='POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created, you are now able to login!')
            return redirect('login')
    else:
        form = UserRegisterForm()

    return render(request, 'users/register.html', {'form': form})

@login_required
def tt(request):
    if request.user.is_authenticated:
        tt = Timetable.objects.filter(user=request.user).order_by('day')
        return render(request, 'users/time_table.html', {'tt': tt})
    else:
        return render(request, 'homepage/home.html')

@login_required
def tt_add(request):
    return render(request, 'users/tt_add.html')
    
@login_required
def newPage(request):
    user=request.user
    sem = request.POST.get("semester")
    sub = request.POST.get("subject")
    room_no = request.POST.get("room")
    date = request.POST.get("date")
    time = request.POST.get("time")
    day = request.POST.get("day")

    o_ref = Timetable(user=user,semester=sem, subject=sub, room_no=room_no, date=date, time=time, day=day)
    o_ref.save()
    messages.success(request, f'Timetable edited successfully!')
    return redirect('time_table')

@login_required
def delete_tt(request, tt_id):
    tt= Timetable.objects.get(pk=tt_id)
    tt.delete()
    return redirect('time_table')

forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Timetable

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

template.html

{% extends "homepage/base.html" %}
{% block content %}
<h2>{{ user.username }}'s Time table.</h2>

<table class="table">
    <th>Subject</th>
    <th>Semester</th>
    <th>Time</th>
    <th>Date</th>
    <th>Day</th>
    <th>&nbsp;</th>

    {% for tt in tt %}
    <tr>
        <td>{{ tt.subject }}</td>
        <td>{{ tt.semester }}</td>
        <td>{{ tt.time }}</td>
        <td>{{ tt.date }}</td>
        <td>{{ tt.day }}</td>
        <td><a href="{% url 'delete_tt' tt.id %}" class="btn btn-outline-danger">Delete</a>
        </td>
    </tr>

    {% endfor %}

</table>
<br>
<br>
<a class="btn btn-primary" href="{% url 'time_table_add' %}" role="button">Add record to timetable</a>

{% endblock content %}

create.html

{% extends "homepage/base.html" %}
{% block content %}

<h2>Editing Timetable...</h2>

<form action="/new/" method="post">
    {% csrf_token %}
    <table border="3px solid black" class="table">
            <th>
                Semester: <input type="text" place="Which semester?" name="semester">
            </th>
        </tr>
        <tr>
            <th>
                Subject: <input type="text" placeholder="Subject to be taught" name="subject">
            </th>
        </tr>
        <tr>
            <th>
                Room Number: <input type="text" placeholder="Room Number" name="room">
            </th>
        </tr>
        <tr>
            <th>
                Date: <input type="date" name="date">
            </th>
        </tr>
        <tr>
            <th>
                Time: <input type="time" name="time">
            </th>
        </tr>
        <tr>
            <th>
                Day: <input type="text" name="day">
            </th>
        </tr>
    </table>

    <input class="btn btn-primary" type="submit" value="Save">
    &nbsp;
    <input class="btn btn-primary" type="reset" value="Reset">
</form>
<br>
<a class="btn btn-primary" href="{% url 'time_table' %}" role="button">View Timetable</a>

{% endblock content %}

Any help would be appreciated. Thanks in advance :)



Solution 1:[1]


@login_required
def newPage(request):
    if request.method == 'POST':  # check post
      sem = request.POST.get("semester")
      sub = request.POST.get("subject")
      room_no = request.POST.get("room")
      date = request.POST.get("date")
      time = request.POST.get("time")
      day = request.POST.get("day")

      Timetable.objects.create(user=request.user,semester=sem, 
      subject=sub, room_no=room_no, date=date, time=time, day=day)
      messages.success(request, f'Timetable edited successfully!')
      return redirect('time_table')

if u need to include update function create similar fuction to update it also

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dharman