在flask admin中,我有一个内联模型,它有一个名为'Type'的Select 2字段和一个名为'URL'的文本输入字段。
x1c 0d1x的数据
当用户在“类型”字段中选择一个值时,我希望“URL”字段的值能够使用预定义和Map的值动态更新。
举例来说:如果选择的“类型”是“Wikidata”,我想在“URL”字段中预先填充“https://www.wikidata.org/wiki/”,或者如果选择的“类型”是“DataBnf”,则在“URL”字段中预先填充“https:data.bnf.fr/fr/”等。
我尝试使用jQuery拦截选择事件(select 2),但似乎不起作用。我想知道在Flask-Admin中是否有更简单的方法来根据下拉列表选择预填充字段。
提前感谢您的建议
[Edit 1]
这是我的模型视图:views.py
(简化版):
class PersonView(ModelView):
can_export = True
can_view_details = False
column_display_pk = True
create_template = 'admin/edit.html'
edit_template = 'admin/edit.html'
#...
#... some formaters functions for specific fields ...
extra_js = ['//cdn.ckeditor.com/4.6.0/basic/ckeditor.js']
#...
inline_models = [
(
# This inline model I try to customize
PersonHasKbLinks,
dict(
form_columns=["id", "type_kb", "url"],
column_labels={"type_kb": "Type", "url": "URL"},
)
),
# ... others inline models
]
# ...
form_choices = {
'type_kb': format_enum(KnowledgeBaseLabels),
'relation_type': format_enum(FamilyRelationshipLabels)
}
#...
字符串edit.html
:
{% extends 'admin/model/edit.html' %}
{% block tail_js %}
{{ super() }}
<script type="text/javascript" src="{{ url_for('static', filename='js/_prefill_kb_url.js') }}"></script>
{% endblock %}
型master.html
:
{% extends admin_base_template %}
{% block head %}
{{ super() }}
<!-- add jquery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js" integrity="sha512-3gJwYpMe3QewGELv8k/BX9vcqhryRdzRMxVfq6ngyWXwo03GFEzjsUm8Q7RZcHPHksttq7/GFoxjCVUjkjvPdw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- add select2 dependencies -->
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
{% endblock %}
型_prefill_kb_url.js
(目前我只是试图捕捉select 2列表上的事件(更改或选择),但我失败了,我不确定这是否是在flask admin中完成我想做的事情的最佳策略):
// I try this (no output) :
$(document).ready(function() {
$('#s2id_kb_links-0-type_kb').on('change', function() {
console.log('select change');
});
});
// and I try this (no output also) :
$(document).ready(function() {
$('body').on('select2:select', '#s2id_kb_links-0-type_kb', function (e) {
console.log('select change');
}
});
});
型
我注意到在我的浏览器中,创建了一个select元素(id="kb_links-0-type_kb"
),但它默认为CSS属性display:none
,好像flask-admin overide select 2(也许我错了...?)
的
1条答案
按热度按时间9bfwbjaz1#
经过一番研究,我终于找到了解决办法:
首先,在
views.py
中,我创建了一个自定义的SelectField
:字符串
总是在
views.py
中,在我的模型PersonView
中,我将新的自定义SelectField
链接到inline_models
中的字段:型
然后我在JS脚本
person.form.fields.js
中编写了一个特定的函数,当用户在type_kb
字段中选择一个值时,动态替换url
字段中的正确值:型
最后,我将我的js脚本附加到
edit.html
模板:型
下面是表单中的结果:
的数据
注意:我使用
Flask-Admin==1.6.1