misc: add possibility to define tabs by specifying fields (#63390)

This commit is contained in:
Frédéric Péters 2022-04-11 15:58:08 +02:00
parent b406d1808c
commit 2ba7eb256e
3 changed files with 11 additions and 4 deletions

View File

@ -409,14 +409,13 @@ class Map(CellBase):
return forms.models.modelform_factory(self.__class__, fields=fields)
def get_manager_tabs(self):
zoom_fields = ['initial_zoom', 'min_zoom', 'max_zoom']
tabs = super().get_manager_tabs()
tabs.insert(
1,
{
'slug': 'zoom',
'name': _('Zoom'),
'form': forms.models.modelform_factory(self.__class__, fields=zoom_fields),
'fields': ['initial_zoom', 'min_zoom', 'max_zoom'],
},
)
return tabs

View File

@ -14,7 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django import template
from django import forms, template
from django.urls import reverse
register = template.Library()
@ -34,6 +34,8 @@ def cell_form(context, cell):
continue
else:
form_name = '%s_form' % tab['slug']
if tab.get('fields'):
tab['form'] = forms.models.modelform_factory(cell.__class__, fields=tab['fields'])
tab['form_instance'] = tab['form'](initial={}, instance=cell, prefix='c%s' % cell.get_reference())
context[form_name] = tab['form_instance']
context['cell'] = cell

View File

@ -20,7 +20,7 @@ import json
import tarfile
from operator import attrgetter, itemgetter
from django import template
from django import forms, template
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
@ -703,6 +703,10 @@ class PageEditCellView(ManagedPageMixin, UpdateView):
try:
with transaction.atomic():
for tab in self.object.get_manager_tabs():
if tab.get('fields'):
tab['form'] = forms.models.modelform_factory(
self.object.__class__, fields=tab['fields']
)
form = tab['form'](**self.get_form_kwargs())
if form.is_valid():
self.object = form.save()
@ -716,6 +720,8 @@ class PageEditCellView(ManagedPageMixin, UpdateView):
pass
for tab in self.object.get_manager_tabs():
if tab.get('fields'):
tab['form'] = forms.models.modelform_factory(self.object.__class__, fields=tab['fields'])
# if current form had no errors, create it anew
# so it can get new dynamic fields
form = tab_error_forms.get(tab['slug']) or tab['form'](**self.get_form_kwargs())