Form logic: only save if valid, delete pages when the last sections is deleted

main
Jaap Joris Vens 2020-02-20 10:49:11 +01:00
rodzic d5f5bb4296
commit 241e5af2d3
5 zmienionych plików z 61 dodań i 38 usunięć

Wyświetl plik

@ -180,6 +180,10 @@ div.edit {
right: 1em;
bottom: 1em;
z-index: 1000;
button {
padding: 0;
outline: none;
}
img {
width: 75px;
height: auto;
@ -262,15 +266,6 @@ form.cms {
margin-top: 3em;
}
div.global_error {
border: 2px dotted red;
padding: 10px;
margin: 1em -10px;
background: #f001;
color: red;
font-weight: bold;
}
fieldset {
padding: 2em;
margin-bottom: 2em;
@ -370,7 +365,7 @@ form.cms {
padding: 0;
list-style: none;
color: red;
font-size: 12px !important;
font-size: 12px;
li {
margin: 0;
@ -378,6 +373,20 @@ form.cms {
}
}
div.global_error {
border: 2px dotted red;
padding: 10px;
margin: 1em -10px;
background: #f001;
color: red;
font-weight: bold;
ul.errorlist {
margin: 0;
font-size: inherit;
}
}
.errors {
color: red;
font-weight: bold;

Wyświetl plik

@ -133,6 +133,9 @@ div.edit {
right: 1em;
bottom: 1em;
z-index: 1000; }
div.edit.page button {
padding: 0;
outline: none; }
div.edit.page img {
width: 75px;
height: auto; }
@ -183,14 +186,6 @@ section.contact div#message {
form.cms section {
margin-top: 3em; }
form.cms div.global_error {
border: 2px dotted red;
padding: 10px;
margin: 1em -10px;
background: #f001;
color: red;
font-weight: bold; }
form.cms fieldset {
padding: 2em;
margin-bottom: 2em;
@ -273,11 +268,22 @@ form.cms ul.errorlist {
padding: 0;
list-style: none;
color: red;
font-size: 12px !important; }
font-size: 12px; }
form.cms ul.errorlist li {
margin: 0;
padding: 0; }
form.cms div.global_error {
border: 2px dotted red;
padding: 10px;
margin: 1em -10px;
background: #f001;
color: red;
font-weight: bold; }
form.cms div.global_error ul.errorlist {
margin: 0;
font-size: inherit; }
form.cms .errors {
color: red;
font-weight: bold; }

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -11,7 +11,11 @@
{% if form %}
<section>
<div class="wrapper">
{% if form.errors or formset.errors %}
{% if form.non_field_errors %}
<div class="global_error">
{{form.non_field_errors}}
</div>
{% elif form.errors or formset.errors %}
<div class="global_error">
{% trans 'Please correct the error(s) below and save again' %}
</div>

Wyświetl plik

@ -1,13 +1,13 @@
import json
import swapper
from django.shortcuts import redirect
from django.views.generic import base, detail, edit
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import redirect
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ImproperlyConfigured
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.mixins import UserPassesTestMixin
#from django.http import HttpResponseRedirect, HttpResponseBadRequest
from .decorators import register_view
from .forms import PageForm, SectionForm, SectionFormSet
@ -37,7 +37,7 @@ class SectionFormView(edit.FormMixin, SectionView):
form = self.get_form()
if form.is_valid():
form.save(request)
return redirect(self.get_success_url())
return HttpResponseRedirect(self.get_success_url())
return form
class SectionFormSetView(SectionView):
@ -50,7 +50,7 @@ class SectionFormSetView(SectionView):
formset = self.get_formset()
if formset.is_valid():
formset.save(request)
return redirect(self.get_success_url())
return HttpResponseRedirect(self.get_success_url())
return formset
def get_formset(self):
@ -178,22 +178,26 @@ class EditPage(UserPassesTestMixin, edit.ModelFormMixin, base.TemplateResponseMi
self.object = self.get_object()
return self.render_to_response(self.get_context_data())
def get_formset(self):
return SectionFormSet(self.request.POST, self.request.FILES, instance=self.object)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
page = form.save()
formset = SectionFormSet(request.POST, request.FILES, instance=page)
if formset.is_valid():
if formset.save():
if page.slug and not page.sections.exists(): # anymore
page.delete()
return HttpResponseRedirect('/')
return HttpResponseRedirect(page.get_absolute_url())
else:
# TODO: show sensible error
formset.errors.append([{}, {'title': ['You have to add sections']}])
formset = SectionFormSet(request.POST, request.FILES)
formset = self.get_formset()
if form.is_valid() and formset.is_valid():
if not self.object and not formset.has_changed():
form.add_error(None, _('You cant save a new page without adding any sections!'))
else:
page = form.save()
formset.instance = page
formset.save()
if page.slug and not page.sections.exists():
page.delete()
return HttpResponseRedirect('/')
return HttpResponseRedirect(page.get_absolute_url())
return self.render_to_response(self.get_context_data(form=form, formset=formset))
class CreatePage(EditPage):