Django ModelForm Notes (with Book Example)




from django.db import models

class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
published_date = models.DateField()

def __str__(self):
return self.title


from django import forms
from .models import Book

class BookForm(forms.ModelForm):
published_date = forms.DateField(
widget=forms.DateInput(attrs={'type': 'date'})
)

class Meta:
model = Book
fields = ['title', 'author', 'published_date']
    


from django.urls import path
from . import views

urlpatterns = [
path('', views.book_list, name='book_list'),
path('create/', views.book_create, name='book_create'),
path('update/<int:pk>/', views.book_update, name='book_update'),
path('delete/<int:pk>/', views.book_delete, name='book_delete'),
]

from django.shortcuts import render, redirect, get_object_or_404
from .models import Book
from .forms import BookForm

# List all books
def book_list(request):
books = Book.objects.all()
return render(request, 'book_list.html', {'books': books})

# Add new book
def book_create(request):
if request.method == 'POST':
form = BookForm(request.POST)
if form.is_valid():
form.save()
return redirect('book_list')
else:
form = BookForm()
return render(request, 'book_form.html', {'form': form})

# Update existing book
def book_update(request, pk):
book = get_object_or_404(Book, pk=pk)
form = BookForm(request.POST or None, instance=book)
if form.is_valid():
form.save()
return redirect('book_list')
return render(request, 'book_form.html', {'form': form})

# Delete book
def book_delete(request, pk):
book = get_object_or_404(Book, pk=pk)
if request.method == 'POST':
book.delete()
return redirect('book_list')
return render(request, 'book_confirm_delete.html', {'book': book})





book_confirm_delete.html

<h2>Delete "{{ book.title }}"?</h2>
<form method="post">
{% csrf_token %}
<button type="submit">Yes, Delete</button>
<a href="{% url 'book_list' %}">Cancel</a>
</form>



book_form.html

<h2>{% if form.instance.pk %}Edit{% else %}Add{% endif %} Book</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>


book_list.html

<h2>Book List</h2>
<a href="{% url 'book_create' %}">Add New Book</a>
<ul>
{% for book in books %}
<li>
{{ book.title }} by {{ book.author }} ({{ book.published_date }})
<a href="{% url 'book_update' book.pk %}">Edit</a>
<a href="{% url 'book_delete' book.pk %}">Delete</a>
</li>
{% endfor %}
</ul>




from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]










Comments

Popular posts from this blog

Mastering Django: Project and App Folder Structure

Mastering Django Template Language (DTL): A Step-by-Step Guide

How to Add Templates in Django: Step-by-Step Guide