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

Wyświetl plik

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

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -11,7 +11,11 @@
{% if form %} {% if form %}
<section> <section>
<div class="wrapper"> <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"> <div class="global_error">
{% trans 'Please correct the error(s) below and save again' %} {% trans 'Please correct the error(s) below and save again' %}
</div> </div>

Wyświetl plik

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