Commit aea3ef30 authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #1162 from pawl/fix_editable_list2

Fix editable list view - CSRF validation & widget override
parents 2a724048 d96abd19
...@@ -1709,11 +1709,6 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1709,11 +1709,6 @@ class BaseModelView(BaseView, ActionsMixin):
""" """
List view List view
""" """
if self.column_editable_list:
form = self.list_form
else:
form = None
if self.can_delete: if self.can_delete:
delete_form = self.delete_form() delete_form = self.delete_form()
else: else:
...@@ -1731,6 +1726,11 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1731,6 +1726,11 @@ class BaseModelView(BaseView, ActionsMixin):
count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc, count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc,
view_args.search, view_args.filters) view_args.search, view_args.filters)
list_forms = {}
if self.column_editable_list:
for row in data:
list_forms[self.get_pk_value(row)] = self.list_form(obj=row)
# Calculate number of pages # Calculate number of pages
if count is not None: if count is not None:
num_pages = count // self.page_size num_pages = count // self.page_size
...@@ -1767,7 +1767,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1767,7 +1767,7 @@ class BaseModelView(BaseView, ActionsMixin):
return self.render( return self.render(
self.list_template, self.list_template,
data=data, data=data,
form=form, list_forms=list_forms,
delete_form=delete_form, delete_form=delete_form,
# List # List
......
...@@ -33,7 +33,7 @@ def create_editable_list_form(form_base_class, form_class, widget=None): ...@@ -33,7 +33,7 @@ def create_editable_list_form(form_base_class, form_class, widget=None):
WTForms widget class. Defaults to `XEditableWidget`. WTForms widget class. Defaults to `XEditableWidget`.
""" """
if widget is None: if widget is None:
widget = XEditableWidget widget = XEditableWidget()
class ListForm(form_base_class): class ListForm(form_base_class):
list_form_pk = HiddenField(validators=[InputRequired()]) list_form_pk = HiddenField(validators=[InputRequired()])
...@@ -41,7 +41,7 @@ def create_editable_list_form(form_base_class, form_class, widget=None): ...@@ -41,7 +41,7 @@ def create_editable_list_form(form_base_class, form_class, widget=None):
# iterate FormMeta to get unbound fields, replace widget, copy to ListForm # iterate FormMeta to get unbound fields, replace widget, copy to ListForm
for name, obj in iteritems(form_class.__dict__): for name, obj in iteritems(form_class.__dict__):
if isinstance(obj, UnboundField): if isinstance(obj, UnboundField):
obj.kwargs['widget'] = XEditableWidget() obj.kwargs['widget'] = widget
setattr(ListForm, name, obj) setattr(ListForm, name, obj)
if name == "list_form_pk": if name == "list_form_pk":
......
...@@ -157,10 +157,11 @@ ...@@ -157,10 +157,11 @@
{% for c, name in list_columns %} {% for c, name in list_columns %}
<td class="col-{{c}}"> <td class="col-{{c}}">
{% if admin_view.is_editable(c) %} {% if admin_view.is_editable(c) %}
{% set form = list_forms[get_pk_value(row)] %}
{% if form.csrf_token %} {% if form.csrf_token %}
{{ form(obj=row)[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=form.csrf_token._value()) }} {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=form.csrf_token._value()) }}
{% else %} {% else %}
{{ form(obj=row)[c](pk=get_pk_value(row), display_value=get_value(row, c)) }} {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c)) }}
{% endif %} {% endif %}
{% else %} {% else %}
{{ get_value(row, c) }} {{ get_value(row, c) }}
......
...@@ -153,13 +153,15 @@ ...@@ -153,13 +153,15 @@
</td> </td>
{%- endif -%} {%- endif -%}
{% endblock %} {% endblock %}
{% for c, name in list_columns %} {% for c, name in list_columns %}
<td class="col-{{c}}"> <td class="col-{{c}}">
{% if admin_view.is_editable(c) %} {% if admin_view.is_editable(c) %}
{% set form = list_forms[get_pk_value(row)] %}
{% if form.csrf_token %} {% if form.csrf_token %}
{{ form(obj=row)[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=form.csrf_token._value()) }} {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=form.csrf_token._value()) }}
{% else %} {% else %}
{{ form(obj=row)[c](pk=get_pk_value(row), display_value=get_value(row, c)) }} {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c)) }}
{% endif %} {% endif %}
{% else %} {% else %}
{{ get_value(row, c) }} {{ get_value(row, c) }}
......
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