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

Fixed #123. Now it is possible to customize label for inline forms

parent fb73033e
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.admin import Admin
from flask.ext.admin.contrib.sqlamodel import ModelView
app = Flask(__name__)
app.config['SECRET_KEY'] = '123456790'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
app.config['SQLALCHEMY_ECHO'] = True
# .. read settings
db = SQLAlchemy(app)
# .. model declarations here
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
email = db.Column(db.String(128))
if __name__ == '__main__':
admin = Admin(app)
admin.add_view(ModelView(User, db.session))
db.create_all()
app.run('0.0.0.0', 8000)
......@@ -146,12 +146,15 @@ class InlineModelConverter(InlineModelConverterBase):
converter=converter)
prop_name = 'fa_%s' % model.__name__
label = self.get_label(info, prop_name)
setattr(form_class,
prop_name,
InlineModelFormList(child_form,
info.model,
reverse_field.name,
label=info.model.__name__))
label=label or info.model.__name__))
setattr(field.rel_model,
prop_name,
......
......@@ -104,6 +104,27 @@ class ModelView(BaseModelView):
class MyModelView(ModelView):
inline_models = (MyInlineModelForm(MyInlineModel),)
You can customize generated field name by:
1. Using `form_name` property as option:
class MyModelView(ModelView):
inline_models = ((Post, dict(form_label='Hello')))
2. Using target model name with `fa_` prefis:
class Model1(Base):
# ...
pass
class Model2(Base):
# ...
pass
class MyModel1View(Base):
inline_models = (Model2,)
column_labels = {'fa_Model2': 'Hello'}
"""
def __init__(self, model, name=None,
......@@ -211,7 +232,7 @@ class ModelView(BaseModelView):
def scaffold_inline_form_models(self, form_class):
converter = self.model_form_converter()
inline_converter = self.inline_model_form_converter()
inline_converter = self.inline_model_form_converter(self)
for m in self.inline_models:
form_class = inline_converter.contribute(converter,
......
......@@ -330,7 +330,8 @@ class InlineModelConverter(InlineModelConverterBase):
"""
Inline model form helper.
"""
def __init__(self, session):
def __init__(self, session, view):
super(InlineModelConverter, self).__init__(view)
self.session = session
def get_info(self, p):
......@@ -428,12 +429,19 @@ class InlineModelConverter(InlineModelConverterBase):
# Post-process form
child_form = info.postprocess_form(child_form)
kwargs = dict()
label = self.get_label(info, forward_prop.key)
if label:
kwargs['label'] = label
# Contribute field
setattr(form_class,
forward_prop.key,
InlineModelFormList(child_form,
self.session,
info.model,
forward_prop.key))
forward_prop.key,
**kwargs))
return form_class
......@@ -193,6 +193,26 @@ class ModelView(BaseModelView):
class MyModelView(ModelView):
inline_models = (MyInlineModelForm(MyInlineModel),)
You can customize generated field name by:
1. Using `form_name` property as option:
class MyModelView(ModelView):
inline_models = ((Post, dict(form_label='Hello')))
2. Using forward relation name and `column_labels` property:
class Model1(Base):
pass
class Model2(Base):
# ...
model1 = relation(Model1, backref='models')
class MyModel1View(Base):
inline_models = (Model2,)
column_labels = {'models': 'Hello'}
"""
def __init__(self, model, session,
......@@ -464,7 +484,7 @@ class ModelView(BaseModelView):
Form class
"""
converter = self.model_form_converter(self.session, self)
inline_converter = self.inline_model_form_converter(self.session)
inline_converter = self.inline_model_form_converter(self.session, self)
for m in self.inline_models:
form_class = inline_converter.contribute(converter,
......
......@@ -99,6 +99,35 @@ class ModelConverterBase(object):
class InlineModelConverterBase(object):
def __init__(self, view):
"""
Base constructor
:param view:
View class
"""
self.view = view
def get_label(self, info, name):
"""
Get inline model field label
:param info:
Inline model info
:param name:
Field name
"""
form_name = getattr(info, 'form_label', None)
if form_name:
return form_name
column_labels = getattr(self.view, 'column_labels', None)
if column_labels and name in column_labels:
return column_labels[name]
return None
def get_info(self, p):
"""
Figure out InlineFormAdmin information.
......
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