我有一个 RadioField 表单项,它使用数据库中的字段值。
如果没有创建数据库,我将无法启动 Flask Webserver,即使它应该只在我转到该页面并加载该表单时访问该数据库。
如果我在 Web 服务器运行时更新数据库,我将看不到包含新数据库信息的表单。
直到我重新启动 Flask 网络服务器。
我怎样才能得到它,以便在您访问页面时强制表单从数据库中重新加载其值。
此外,我很确定它将 RadioField 的值存储在内存中,因为我可以删除数据库并且 Flask Webserver 将继续运行并且 RadioField 仍将显示。
我正在使用 sqlite3 数据库并使用 APSW(另一个 python sqlite3 包装器)读取和写入它
这是我的表格
class DatabaseForm(Form):
listOfRows = db.getDatabase()
rows = [(str(x[0]), x) for x in listOfRows]
images = RadioField('images', validators = [Required()], choices = rows)
Run Code Online (Sandbox Code Playgroud)
这是我的观点
@app.route('/database', methods = ['GET', 'POST'])
def database():
''' displays the database and allows the user to select an entry '''
form = DatabaseForm()
if form.validate_on_submit():
primaryKey = form.images.data …Run Code Online (Sandbox Code Playgroud) 使用flask-sqlalchemy,我想创建一些类来继承声明性类并添加__bind_key__.这样我就可以创建一些表并继承这些绑定类.
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Model1(db.Model):
__bind_key__ = 'db2'
class Table1(Model1):
__tablename__ = 'table1'
name = db.Column(db.String(100))
Run Code Online (Sandbox Code Playgroud)
但是我遇到了一些麻烦:
sqlalchemy.exc.InvalidRequestError: Class <class '__main__.Model1'>
does not have a __table__ or __tablename__ specified
and does not inherit from an existing table-mapped class.
Run Code Online (Sandbox Code Playgroud)
我该怎么解决?
我有一个小问题:简单的类
class AModel(db.Model):
id = db.Column(....)
title = db.Column(....)
uniq_text_id = db.Column(db.String(50), unique=True. nullable=False)
def __init__(self):
uniq_text_id = uuid4().hex
Run Code Online (Sandbox Code Playgroud)
现在我调整了flask-admin 包以及管理员能够创建AModel实例的权限。但有 1 种情况:uniq_text_id必须自动创建字段。
所以,现在我无法创建模式,因为flask-admin 说需要fiel uniq_text_id,但也没有显示预填充的值。
有没有办法在flask-admin 表单中使用预填充的值,或者在不放弃nullable=False约束的情况下以某种方式避免这个问题?
UPD: @codegeek 为仍显示在表单上的自动生成字段提供了很好的解决方案。我自己的解决方案使用由flask-admin 功能提供,允许显式声明显示哪些列以及隐藏哪些列。
我基本上只需要知道如何通过排除选定的列进行查询.这可能吗?
示例:我的桌子有id,姓名,年龄,地址,位置,出生年龄,性别......等.
我想要排除查询中的某些列(例如,排除年龄),而不是引用要检索的列.
示例代码:
db.session.query(User.username).filter_by(username = request.form['username'], password = request.form['password']).first()
Run Code Online (Sandbox Code Playgroud)
我想做的最后一件事是列出query()方法的所有属性,因为这将是非常长的,特别是当你有很多属性时,因此我只想排除一些列.
修改子表后,如何更新父时间戳?
我想使用父表时间戳检查我的其余客户端是否应更新这些表的本地版本。
class Parent(db.Model):
id = db.Column(db.Integer, primary_key=True)
version = db.Column(db.Integer)
timestamp = db.Column(db.DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow)
childs = db.relationship('Children',
backref='parent',
lazy='dynamic',
cascade="all, delete-orphan")
class Children(db.Model):
id = db.Column(db.Integer, primary_key=True)
version = db.Column(db.Integer)
timestamp = db.Column(db.DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow)
parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'), nullable=False)
Run Code Online (Sandbox Code Playgroud)
并测试一下:
db.create_all()
parent = Parent(version=1)
child = Children(version=1, parent=parent)
db.session.add_all([parent, child])
db.session.commit()
print "parent timestamp: %s, child timestamp %s" % (parent.timestamp, child.timestamp)
previous_timestamp = parent.timestamp
parent.version = 2
db.session.add(parent)
db.session.commit()
assert parent.timestamp != previous_timestamp # this works
print …Run Code Online (Sandbox Code Playgroud) 假设我们在所有者和屏幕之间有一对多的关系(所有者可以拥有多个屏幕).
通过使用hybrid_property并在关系上调用count(),可以显示一列显示每个所有者拥有的屏幕数.但是我没有找到一种方法来使这个值计算值在Web界面中可排序:如果我在column_sortable_list中添加number_of_screens,我收到以下错误:
Traceback (most recent call last):
File "app.py", line 71, in <module>
admin.add_view(OwnerAdmin(Owner, db.session))
File "C:\Python27\lib\site-packages\flask_admin\contrib\sqla\view.py", line 319, in __init__
menu_icon_value=menu_icon_value)
File "C:\Python27\lib\site-packages\flask_admin\model\base.py", line 718, in __init__
self._refresh_cache()
File "C:\Python27\lib\site-packages\flask_admin\model\base.py", line 795, in _refresh_cache
self._sortable_columns = self.get_sortable_columns()
File "C:\Python27\lib\site-packages\flask_admin\contrib\sqla\view.py", line 539, in get_sortable_columns
column, path = self._get_field_with_path(c)
File "C:\Python27\lib\site-packages\flask_admin\contrib\sqla\view.py", line 365, in _get_field_with_path
value = getattr(model, attribute)
File "C:\Python27\lib\site-packages\sqlalchemy\ext\hybrid.py", line 740, in __get__
return self.expr(owner)
File "app.py", line 48, in number_of_screens
return self.screens.count()
File "C:\Python27\lib\site-packages\sqlalchemy\orm\attributes.py", line 193, in __getattr__ …Run Code Online (Sandbox Code Playgroud) 我正在使用Flask-SQLAlchemy构建一个Flask应用程序,并且试图编写一个无需运行主应用程序即可创建Sqlite3数据库的脚本。为了避免循环引用,我已经在单独的模块中初始化了Flask应用程序主对象和SQLAlchemy数据库对象。然后,在运行该应用程序时,我将其导入并合并到第三个文件中。当我运行应用程序时,这可以很好地工作,因为数据库已构建,并且在创建行和查询行时可以正常运行。但是,当我尝试将它们导入另一个模块时,出现以下错误:
RuntimeError: application not registered on db instance and no applicationbound to current context
Run Code Online (Sandbox Code Playgroud)
我的代码如下所示:
root / create_database.py
from application.database import db
from application.server import app
db.init_app(app)
db.create_all()
Run Code Online (Sandbox Code Playgroud)
根/run.sh
export FLASK_APP=application/server.py
flask run
Run Code Online (Sandbox Code Playgroud)
root /应用程序/ init .py
from database import db
from server import app
db.init_app(app)
from routes import apply_routes
apply_routes(app)
Run Code Online (Sandbox Code Playgroud)
根目录/应用程序/数据库.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
Run Code Online (Sandbox Code Playgroud)
根/应用程序/ server.py
from flask import Flask
import os
app = Flask(__name__)
path = os.path.dirname( os.path.realpath(__file__) )
database_path = os.path.join(path, '../mydb.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] …Run Code Online (Sandbox Code Playgroud) 所以,我想提出新瓶的应用程序,甚至在其他项目中发现db.Column并Column可互换使用.那你什么时候用另一个呢?
id = db.Column(Integer(), primary_key=True)
Run Code Online (Sandbox Code Playgroud)
VS
id = Column(Integer(), primary_key=True)
Run Code Online (Sandbox Code Playgroud) from flask import Flask, request, flash, url_for, redirect, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
app.config['SECRET_KEY'] = "random string"
db = SQLAlchemy(app)
class students(db.Model):
id = db.Column('student_id', db.Integer, primary_key = True)
name = db.Column(db.String(100))
city = db.Column(db.String(50))
addr = db.Column(db.String(200))
pin = db.Column(db.String(10))
def __init__( self, name, city, addr, pin):
self.name = name
self.city = city
self.addr = addr
self.pin = pin
def __str__(self):
return "{} {} {} {}".format(self.name,self.city,self.addr,self.pin)
@app.route('/')
def show_all():
return render_template('show_all.html', students = …Run Code Online (Sandbox Code Playgroud) 我正在尝试向flask-admin表单添加其他操作。
它必须增加额定值(+1),并且可以批量操作,但不能单次使用。请帮助我找到错误,我花了很多时间尝试使此事情正常运行。
这是代码:
我在模板文件夹中创建了一个html模板-custom_lists.html
{% extends 'admin/model/list.html' %}
{% block list_row_actions %}
{{ super() }}
<form class="icon" method="POST" action="/admin/user/action/">
<input id="action" name="action" value="approve" type="hidden">
<input name="rowid" value="{{ get_pk_value(row) }}" type="hidden">
<button onclick="return confirm('Are you sure you want to approve selected items?');" title="Approve">
<span class="fa fa-ok glyphicon glyphicon-ok"></span>
</button>
</form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
这成功地在列表上显示了一个图标,但是如果我单击它,它会说
未找到
在服务器上找不到请求的URL。如果您手动输入网址,请检查拼写,然后重试。
添加到模板文件夹,并添加到AdidasView类,如下所示:
list_template = 'custom_list.html'
@action('approve', 'Approve', 'Are you sure you want to approve selected items?')
def action_approve(self, ids):
try:
query = Adidas.query.filter(Adidas.id.in_(ids))
count = 0 …Run Code Online (Sandbox Code Playgroud) flask-sqlalchemy ×10
python ×8
flask ×6
sqlalchemy ×4
flask-admin ×2
jinja2 ×1
python-2.7 ×1
python-3.5 ×1
sqlite ×1