gpt4 book ai didi

datetime - Flask wtforms 访问和编辑配置数据

转载 作者:行者123 更新时间:2023-12-03 17:33:01 25 4
gpt4 key购买 nike

我正在使用带有 flask 框架的 wtforms。当我使用 DateTimeField 时,我添加了格式参数。
但是日期时间格式来自已登录的用户

表格.py

from flask import g
from wtforms import *
import wtforms.validators as v
from flask.ext.babel import lazy_gettext as _
from flask.ext.babel import npgettext as _n

from app.app import app
from app.base_forms import *
from app.modules.post.models import *

class PostForm(BaseForm):
post_date = DateTimeField("Post Date", format = app.config.get("DATETIME_FORMAT"), validators =[v.Required(message=_("Post date is required"))] )

我在请求之前设置了 app.config.get("DATETIME_FORMAT") 的值
@app.before_request
def before_request():
if g.user.language == "tr"
app.config["DATETIME_FORMAT"] = "%d.%m.%Y %H:%M"
else:
app.config["DATETIME_FORMAT"] = "%m-%d-%Y %H:%M"

我的应用结构
/app
/modules
/post
/controllers.py
/forms.py
/models.py
/app.py
/run.py

/app/app.py 的内容
from flask import Flask, url_for, g, request, redirect, render_template
app = Flask(__name__)
app.config.from_object('app.config.config.ConfigDevelopment')

# Import Modules
from modules.post.controllers.admin import module as modulePostAdmin
app.register_blueprint(modulePostAdmin)

# other codes here

@app.before_request
def before_request():
if g.user.language == "tr"
app.config["DATETIME_FORMAT"] = "%d.%m.%Y %H:%M"
else:
app.config["DATETIME_FORMAT"] = "%m-%d-%Y %H:%M"

/run.py 的内容
from app.app import app
app.run(host='localhost', port=8080, debug=True)

当我启动应用程序时,它会抛出该错误“KeyError:'DATETIME_FORMAT'”。我认为 forms.py 在请求之前加载,所以它会抛出 keyError。
解决这个问题的正确方法是什么。

最佳答案

哦,我明白了你的问题,你想要的日期格式会根据每个请求而改变。 app.config不会帮你的。

这是我要做的:

from flask import g
from wtforms import DateTimeField


class I18NDateTimeField(DateTimeField):
def __init__(self, label=None, validators=None, format=None, **kwargs):
if g.user.language == "tr"
format = "%d.%m.%Y %H:%M"
else:
format = "%m-%d-%Y %H:%M"
super(I18NDateTimeField, self).__init__(label=label, validators=validators, format=format, **kwargs)


class PostForm(Form):
post_date = I18NDateTimeField("Post Date", validators =[v.Required(message=_("Post date is required"))] )

背景

你(大部分)是对的, before_request还没有被调用。也就是说,表单定义根本不会发生在请求上下文中,它会在应用程序被导入时发生,在任何请求到达之前很久,并且不会多次发生。

但是,表单及其字段将为每个请求再次实例化,这就是它起作用的原因。可以修改 self.format在这里,因为无论如何此字段对象仅用于此请求。

更新 2:

我编辑了对子类 Form 而不是 BaseForm 的答案。 BaseForm 是 WTForms 低级 API 的一部分;他们说不要使用它,除非你确定你需要。我还将国际化逻辑放在构造函数中,而不是 process_formdata (感谢来自 #pocoo 的 mattupstate 的想法)。

我认为这样会更清楚一些,并且在调试器中检查字段会更有意义。现在,按照代码的编写方式,您希望在定义表单时将该字段实例化为类属性,这意味着这不起作用,并且该代码不是线程安全的。但是由于一些元类技巧,当表单被实例化时,该字段实际上被实例化为实例属性。请注意,如果您使用 BaseForm,元类技巧将无法正常工作,这是避免使用 BaseForm 的另一个原因。

更新 3:

抱歉,刚刚在 IRC 上与您交谈,发现您编写了自己的 BaseForm 子类 Form。这很好:)

关于datetime - Flask wtforms 访问和编辑配置数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com