summaryrefslogtreecommitdiff
path: root/postgresqleu
diff options
context:
space:
mode:
authorMagnus Hagander2020-05-11 19:47:59 +0000
committerMagnus Hagander2020-05-11 19:47:59 +0000
commit82be16363b06f95b392af24ecae77c6c4c80a7ec (patch)
tree27da0b8e14a2c1b5a1a3f48621c9e9716802d508 /postgresqleu
parentbad6b69dcbd877843b935189bd5120c93a4f9481 (diff)
Add field and widget to support a custom submit button in backend forms
This form will not do a regular save, and instead call a callback function defined on the field.
Diffstat (limited to 'postgresqleu')
-rw-r--r--postgresqleu/util/backendviews.py11
-rw-r--r--postgresqleu/util/forms.py14
-rw-r--r--postgresqleu/util/templates/forms/widgets/submitbutton_widget.html4
-rw-r--r--postgresqleu/util/widgets.py10
4 files changed, 37 insertions, 2 deletions
diff --git a/postgresqleu/util/backendviews.py b/postgresqleu/util/backendviews.py
index 61c29108..d5544265 100644
--- a/postgresqleu/util/backendviews.py
+++ b/postgresqleu/util/backendviews.py
@@ -108,7 +108,7 @@ def backend_process_form(request, urlname, formclass, id, cancel_url='../', save
if request.method == 'POST' and not nopostprocess:
extra_error = None
- if allow_delete and request.POST['submit'] == 'Delete':
+ if allow_delete and request.POST.get('submit', None) == 'Delete':
if instance.pk:
if hasattr(instance, 'validate_object_delete'):
try:
@@ -141,6 +141,15 @@ def backend_process_form(request, urlname, formclass, id, cancel_url='../', save
if extra_error:
form.add_error(None, extra_error)
+ # Figure out if a custom submit button was pressed
+ for k, v in request.POST.items():
+ if k.startswith('submit_id_'):
+ # We do!
+ f = form.fields[k[10:]]
+ if f.callback:
+ f.callback(request)
+ return HttpResponseRedirect(".")
+
if form.is_valid():
# We don't want to use form.save(), because it actually saves all
# fields on the model, including those we don't care about.
diff --git a/postgresqleu/util/forms.py b/postgresqleu/util/forms.py
index 2dc82288..d504e3f3 100644
--- a/postgresqleu/util/forms.py
+++ b/postgresqleu/util/forms.py
@@ -10,7 +10,7 @@ import base64
from itertools import groupby
from .widgets import InlineImageUploadWidget, InlinePdfUploadWidget
-from .widgets import SelectSetValueWidget
+from .widgets import SubmitButtonWidget, SelectSetValueWidget
class _ValidatorField(forms.Field):
@@ -145,6 +145,18 @@ class PdfBinaryFormField(ImageBinaryFormField):
widget = InlinePdfUploadWidget
+class SubmitButtonField(forms.Field):
+ def __init__(self, *args, **kwargs):
+ if not kwargs:
+ kwargs = {}
+ self.callback = kwargs.pop('callback', None)
+ kwargs['widget'] = SubmitButtonWidget
+ prefixparagraph = kwargs.pop('prefixparagraph', None)
+ super().__init__(*args, **kwargs)
+ self.widget.label = kwargs.get('label', 'Unknown label')
+ self.widget.prefixparagraph = prefixparagraph
+
+
class SelectSetValueField(forms.ChoiceField):
widget = SelectSetValueWidget
diff --git a/postgresqleu/util/templates/forms/widgets/submitbutton_widget.html b/postgresqleu/util/templates/forms/widgets/submitbutton_widget.html
new file mode 100644
index 00000000..54607ddd
--- /dev/null
+++ b/postgresqleu/util/templates/forms/widgets/submitbutton_widget.html
@@ -0,0 +1,4 @@
+{%if prefixparagraph%}
+<p>{{prefixparagraph}}</p>
+{%endif%}
+<input type="submit" class="btn btn-default" name="submit_{{widget.attrs.id}}" value="{{label}}" />
diff --git a/postgresqleu/util/widgets.py b/postgresqleu/util/widgets.py
index 26388092..1a390b9d 100644
--- a/postgresqleu/util/widgets.py
+++ b/postgresqleu/util/widgets.py
@@ -138,6 +138,16 @@ class Bootstrap4HtmlDateTimeInput(forms.DateTimeInput):
template_name = 'forms/widgets/bs4_datetime_input.html'
+class SubmitButtonWidget(forms.Widget):
+ template_name = 'forms/widgets/submitbutton_widget.html'
+
+ def get_context(self, name, value, attrs):
+ d = super().get_context(name, value, attrs)
+ d['label'] = self.label
+ d['prefixparagraph'] = self.prefixparagraph
+ return d
+
+
class SelectSetValueWidget(forms.Select):
option_template_name = 'forms/widgets/select_set_value_option.html'