Python 的 __call__ 方法获取多个值 - 错误
Python's __call__ method gets multiple values - error
在 Flask 中,当我在 Jinja2 模板中呈现表单时(content = PageDownField()
,后者是 TextAreaField
的子class):
{{ form.content(class_='form-control') }}
我收到错误:
__call__() got multiple values for keyword argument 'class_'
这源于以下代码行(在 widget.py 中),其中 class_
已被归因。
html = super(PageDown, self).__call__(field, id = 'flask-pagedown-' + field.name, class_ = 'flask-pagedown-input', **kwargs)
快速而肮脏的解决方案是修改 Flask 扩展的 PageDown
class。
有没有更优雅的方法来解决这个问题?谢谢!
kwargs
中可能已经有一个 class_
值。
试试这个:
kwargs.update(class_='flask-pagedown-input', id='flask-pagedown-' + field.name)
html = super(PageDown, self).__call__(field, **kwargs)
如果这个 CSS class 对你很重要,恐怕你必须编写你自己的小部件,因为这个文件中还有许多其他硬编码的东西(像其他CSS class 在前和 post HTML 字符串中)。
from wtforms.widgets import HTMLString, TextArea
pagedown_pre_html = '''
<div class="form-group">
'''
pagedown_post_html = '''
</div>
<script type="text/javascript">
f = function() {
if (typeof flask_pagedown_converter === "undefined")
flask_pagedown_converter = Markdown.getSanitizingConverter().makeHtml;
var textarea = document.getElementById("flask-pagedown-%s");
var preview = document.createElement('div');
preview.className = 'help-block';
textarea.parentNode.insertBefore(preview, textarea.nextSibling);
textarea.onkeyup = function() { preview.innerHTML = flask_pagedown_converter(textarea.value); }
textarea.onkeyup.call(textarea);
}
if (document.readyState === 'complete')
f();
else if (window.addEventListener)
window.addEventListener("load", f, false);
else if (window.attachEvent)
window.attachEvent("onload", f);
else
f();
</script>
'''
class PageDownBootstrap(TextArea):
def __call__(self, field, **kwargs):
html = super(PageDownBootstrap, self).__call__(field, id = 'flask-pagedown-' + field.name, class_ = 'form-control', **kwargs)
return HTMLString(pagedown_pre_html + html + pagedown_post_html % field.name)
请注意预览块 class 第 15 行的替换,这可能不是您想要的。根据您的需要进行更改。
另一种解决方案是使用 Bootstrap 的 LESS 形式(我猜这是 form-control
的来源)并使 flask-pagedown*
classes 继承对 class 来自 Bootstrap.
在 Flask 中,当我在 Jinja2 模板中呈现表单时(content = PageDownField()
,后者是 TextAreaField
的子class):
{{ form.content(class_='form-control') }}
我收到错误:
__call__() got multiple values for keyword argument 'class_'
这源于以下代码行(在 widget.py 中),其中 class_
已被归因。
html = super(PageDown, self).__call__(field, id = 'flask-pagedown-' + field.name, class_ = 'flask-pagedown-input', **kwargs)
快速而肮脏的解决方案是修改 Flask 扩展的 PageDown
class。
有没有更优雅的方法来解决这个问题?谢谢!
kwargs
中可能已经有一个 class_
值。
试试这个:
kwargs.update(class_='flask-pagedown-input', id='flask-pagedown-' + field.name)
html = super(PageDown, self).__call__(field, **kwargs)
如果这个 CSS class 对你很重要,恐怕你必须编写你自己的小部件,因为这个文件中还有许多其他硬编码的东西(像其他CSS class 在前和 post HTML 字符串中)。
from wtforms.widgets import HTMLString, TextArea
pagedown_pre_html = '''
<div class="form-group">
'''
pagedown_post_html = '''
</div>
<script type="text/javascript">
f = function() {
if (typeof flask_pagedown_converter === "undefined")
flask_pagedown_converter = Markdown.getSanitizingConverter().makeHtml;
var textarea = document.getElementById("flask-pagedown-%s");
var preview = document.createElement('div');
preview.className = 'help-block';
textarea.parentNode.insertBefore(preview, textarea.nextSibling);
textarea.onkeyup = function() { preview.innerHTML = flask_pagedown_converter(textarea.value); }
textarea.onkeyup.call(textarea);
}
if (document.readyState === 'complete')
f();
else if (window.addEventListener)
window.addEventListener("load", f, false);
else if (window.attachEvent)
window.attachEvent("onload", f);
else
f();
</script>
'''
class PageDownBootstrap(TextArea):
def __call__(self, field, **kwargs):
html = super(PageDownBootstrap, self).__call__(field, id = 'flask-pagedown-' + field.name, class_ = 'form-control', **kwargs)
return HTMLString(pagedown_pre_html + html + pagedown_post_html % field.name)
请注意预览块 class 第 15 行的替换,这可能不是您想要的。根据您的需要进行更改。
另一种解决方案是使用 Bootstrap 的 LESS 形式(我猜这是 form-control
的来源)并使 flask-pagedown*
classes 继承对 class 来自 Bootstrap.