diff options
| author | Magnus Hagander | 2020-05-11 19:47:59 +0000 |
|---|---|---|
| committer | Magnus Hagander | 2020-05-11 19:47:59 +0000 |
| commit | 82be16363b06f95b392af24ecae77c6c4c80a7ec (patch) | |
| tree | 27da0b8e14a2c1b5a1a3f48621c9e9716802d508 /postgresqleu | |
| parent | bad6b69dcbd877843b935189bd5120c93a4f9481 (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.py | 11 | ||||
| -rw-r--r-- | postgresqleu/util/forms.py | 14 | ||||
| -rw-r--r-- | postgresqleu/util/templates/forms/widgets/submitbutton_widget.html | 4 | ||||
| -rw-r--r-- | postgresqleu/util/widgets.py | 10 |
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' |
