Commit 9a1dc4e4 authored by Serge S. Koval's avatar Serge S. Koval

Allow widget rendering customization through form_widget_args property

parent 3d957d9f
...@@ -259,6 +259,22 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -259,6 +259,22 @@ class BaseModelView(BaseView, ActionsMixin):
form_overrides = dict(name=wtf.FileField) form_overrides = dict(name=wtf.FileField)
""" """
form_widget_args = None
"""
Dictionary of form widget rendering arguments.
Use this to customize how widget is rendered without using custom template.
Example::
class MyModelView(BaseModelView):
form_widget_args = {
'description': {
'rows': 10,
'style': 'color: black'
}
}
"""
# Actions # Actions
action_disallowed_list = ObsoleteAttr('action_disallowed_list', action_disallowed_list = ObsoleteAttr('action_disallowed_list',
'disallowed_actions', 'disallowed_actions',
...@@ -327,6 +343,9 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -327,6 +343,9 @@ class BaseModelView(BaseView, ActionsMixin):
self._create_form_class = self.get_create_form() self._create_form_class = self.get_create_form()
self._edit_form_class = self.get_edit_form() self._edit_form_class = self.get_edit_form()
if self.form_widget_args is None:
self.form_widget_args = {}
# Search # Search
self._search_supported = self.init_search() self._search_supported = self.init_search()
...@@ -569,7 +588,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -569,7 +588,7 @@ class BaseModelView(BaseView, ActionsMixin):
def get_list(self, page, sort_field, sort_desc, search, filters): def get_list(self, page, sort_field, sort_desc, search, filters):
""" """
Return a paginated and sorted list of models from the data source. Return a paginated and sorted list of models from the data source.
Must be implemented in the child class. Must be implemented in the child class.
:param page: :param page:
...@@ -902,6 +921,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -902,6 +921,7 @@ class BaseModelView(BaseView, ActionsMixin):
return self.render(self.create_template, return self.render(self.create_template,
form=form, form=form,
form_widget_args=self.form_widget_args,
return_url=return_url) return_url=return_url)
@expose('/edit/', methods=('GET', 'POST')) @expose('/edit/', methods=('GET', 'POST'))
...@@ -931,6 +951,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -931,6 +951,7 @@ class BaseModelView(BaseView, ActionsMixin):
return self.render(self.edit_template, return self.render(self.edit_template,
form=form, form=form,
form_widget_args=self.form_widget_args,
return_url=return_url) return_url=return_url)
@expose('/delete/', methods=('POST',)) @expose('/delete/', methods=('POST',))
......
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
{% endif %} {% endif %}
{%- endmacro %} {%- endmacro %}
{% macro render_field(form, field, set_focus=False) %} {% macro render_field(form, field, set_focus=False, kwargs={}) %}
<div class="control-group{{ ' error' if field.errors }}"> <div class="control-group{{ ' error' if field.errors }}">
<div class="control-label"> <div class="control-label">
{{ field.label.text }} {{ field.label.text }}
...@@ -86,9 +86,9 @@ ...@@ -86,9 +86,9 @@
<div class="controls"> <div class="controls">
<div> <div>
{% if set_focus %} {% if set_focus %}
{{ field(autofocus='autofocus')|safe }} {{ field(autofocus='autofocus', **kwargs)|safe }}
{% else %} {% else %}
{{ field()|safe }} {{ field(**kwargs)|safe }}
{% endif %} {% endif %}
</div> </div>
{% if field.description %} {% if field.description %}
...@@ -105,11 +105,12 @@ ...@@ -105,11 +105,12 @@
</div> </div>
{% endmacro %} {% endmacro %}
{% macro render_form_fields(form, set_focus=True) %} {% macro render_form_fields(form, set_focus=True, widget_args={}) %}
{{ form.hidden_tag() if form.hidden_tag is defined }} {{ form.hidden_tag() if form.hidden_tag is defined }}
{% for f in form if f.type != 'HiddenField' and f.type != 'CSRFTokenField' %} {% for f in form if f.type != 'HiddenField' and f.type != 'CSRFTokenField' %}
{{ render_field(form, f, not loop.index0 and set_focus) }} {% set kwargs = widget_args.get(f.name, {}) %}
{{ render_field(form, f, not loop.index0 and set_focus, kwargs) }}
{% endfor %} {% endfor %}
{% endmacro %} {% endmacro %}
...@@ -135,9 +136,9 @@ ...@@ -135,9 +136,9 @@
</div> </div>
{% endmacro %} {% endmacro %}
{% macro render_form(form, cancel_url, extra=None) -%} {% macro render_form(form, cancel_url, extra=None, widget_args={}) -%}
{% call form_tag() %} {% call form_tag() %}
{{ render_form_fields(form) }} {{ render_form_fields(form, widget_args) }}
{{ render_form_buttons(cancel_url, extra) }} {{ render_form_buttons(cancel_url, extra) }}
{% endcall %} {% endcall %}
{% endmacro %} {% endmacro %}
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
{% endmacro %} {% endmacro %}
{% call lib.form_tag() %} {% call lib.form_tag() %}
{{ lib.render_form_fields(form) }} {{ lib.render_form_fields(form, widget_args=form_widget_args) }}
{{ lib.render_form_buttons(return_url, extra()) }} {{ lib.render_form_buttons(return_url, extra()) }}
{% endcall %} {% endcall %}
{% endblock %} {% endblock %}
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
{% block body %} {% block body %}
{% call lib.form_tag() %} {% call lib.form_tag() %}
{{ lib.render_form_fields(form) }} {{ lib.render_form_fields(form, widget_args=form_widget_args) }}
{{ lib.render_form_buttons(return_url) }} {{ lib.render_form_buttons(return_url) }}
{% endcall %} {% endcall %}
{% endblock %} {% endblock %}
......
...@@ -291,6 +291,7 @@ def test_form(): ...@@ -291,6 +291,7 @@ def test_form():
# TODO: form_columns # TODO: form_columns
# TODO: form_excluded_columns # TODO: form_excluded_columns
# TODO: form_args # TODO: form_args
# TODO: form_widget_args
pass pass
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment