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
Post a Comment