start
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
from django.shortcuts import render, get_object_or_404, redirect
|
||||
from django.http import HttpResponse, HttpResponseBadRequest
|
||||
from django.template.loader import render_to_string
|
||||
from .models import Dinosaur
|
||||
from .forms import DinosaurForm
|
||||
|
||||
|
||||
def is_htmx(request):
|
||||
return request.headers.get('HX-Request') == 'true'
|
||||
|
||||
|
||||
def card_list(request):
|
||||
cards = Dinosaur.objects.all()
|
||||
if is_htmx(request):
|
||||
return render(request, 'cards/_cards_list.html', {'cards': cards})
|
||||
return render(request, 'cards/list.html', {'cards': cards})
|
||||
|
||||
|
||||
def card_create(request):
|
||||
if request.method == 'POST':
|
||||
form = DinosaurForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
card = form.save()
|
||||
if is_htmx(request):
|
||||
card_html = render_to_string('cards/_card_item.html', {'card': card}, request=request)
|
||||
# Also return an out-of-band fragment to replace/clear the form container
|
||||
form_html = render_to_string('cards/_form.html', {'form': DinosaurForm()}, request=request)
|
||||
oob = f'<div id="htmx-form" hx-swap-oob="true">{form_html}</div>'
|
||||
return HttpResponse(card_html + oob)
|
||||
return redirect('cards:list')
|
||||
else:
|
||||
if is_htmx(request):
|
||||
# Return the form as an out-of-band fragment so it updates the form container
|
||||
form_html = render_to_string('cards/_form.html', {'form': form}, request=request)
|
||||
oob = f'<div id="htmx-form" hx-swap-oob="true">{form_html}</div>'
|
||||
return HttpResponse(oob)
|
||||
else:
|
||||
form = DinosaurForm()
|
||||
|
||||
return render(request, 'cards/_form.html', {'form': form})
|
||||
|
||||
|
||||
def card_edit(request, pk):
|
||||
card = get_object_or_404(Dinosaur, pk=pk)
|
||||
if request.method == 'POST':
|
||||
form = DinosaurForm(request.POST, request.FILES, instance=card)
|
||||
if form.is_valid():
|
||||
card = form.save()
|
||||
if is_htmx(request):
|
||||
card_html = render_to_string('cards/_card_item.html', {'card': card}, request=request)
|
||||
# Clear the form container via OOB so the edit form disappears after successful save
|
||||
oob = '<div id="htmx-form" hx-swap-oob="true"></div>'
|
||||
return HttpResponse(card_html + oob)
|
||||
return redirect('cards:list')
|
||||
else:
|
||||
if is_htmx(request):
|
||||
form_html = render_to_string('cards/_form.html', {'form': form, 'card': card}, request=request)
|
||||
oob = f'<div id="htmx-form" hx-swap-oob="true">{form_html}</div>'
|
||||
return HttpResponse(oob)
|
||||
else:
|
||||
form = DinosaurForm(instance=card)
|
||||
|
||||
return render(request, 'cards/_form.html', {'form': form, 'card': card})
|
||||
|
||||
|
||||
def card_delete(request, pk):
|
||||
card = get_object_or_404(Dinosaur, pk=pk)
|
||||
if request.method == 'POST':
|
||||
card.delete()
|
||||
if is_htmx(request):
|
||||
return HttpResponse(status=204)
|
||||
return redirect('cards:list')
|
||||
return HttpResponseBadRequest('Only POST allowed')
|
||||
Reference in New Issue
Block a user