kopia lustrzana https://github.com/rtts/django-simplecms
Form logic: only save if valid, delete pages when the last sections is deleted
rodzic
d5f5bb4296
commit
241e5af2d3
|
@ -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;
|
||||
|
|
|
@ -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
|
@ -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>
|
||||
|
|
38
cms/views.py
38
cms/views.py
|
@ -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 can’t 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):
|
||||
|
|
Ładowanie…
Reference in New Issue