我想渲染一个包含一系列文件的表单,代表产品的不同图像.提供文件应该是兼容性的,因此即使没有文件,表单也应该验证.我怎样才能做到这一点 ?
这是我使用的漏勺模式:
import colander
import deform
from deform import Form
from deform import ValidationFailure
from deform.interfaces import FileUploadTempStore
tmpstore = FileUploadTempStore()
class Image(colander.Schema):
image = colander.SchemaNode(
deform.FileData(),
widget=deform.widget.FileUploadWidget(tmpstore)
)
class Images(colander.SequenceSchema):
images = Image()
class ProductSchema(colander.Schema):
completename = colander.SchemaNode(colander.String(), title="Complete Name")
description = colander.SchemaNode(colander.String(),
widget = deform.widget.TextAreaWidget())
images = Images()
schema = ProductSchema()
form = Form(schema, buttons=("submit", ))
Run Code Online (Sandbox Code Playgroud)
我试图添加一个'缺失'的参数,如:
image = colander.SchemaNode(
deform.FileData(),
missing = ???
widget=deform.widget.FileUploadWidget(tmpstore)
)
Run Code Online (Sandbox Code Playgroud)
我觉得我什么时候有功能
missing={'filename': None, 'uid':None}
Run Code Online (Sandbox Code Playgroud)
但我真的不确定这是正确的做法......
谢谢 !
如何在Deform/Colander中定义可以访问所有节点值的自定义验证器.我需要访问两个字段中的值才能确定某个特定值是否有效?
这是我想要做的非常具体,所以我开始描述它是什么:
我想出了使用Matplotlib等渲染的所有部分,但我是Pyramid和Deform的新手.我还有一个工作视图,从文件中提供图.变形也是一种作品.目前还不清楚如何最好地构建ULR以区分服务,编辑和渲染用例.我猜在Pyramid中这意味着如何配置serve_view和edit_view的路由.
__init__.py:
config.add_route('serve_route',
'/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')
config.add_route('edit_route',
'/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')
# can I use query strings like "?action=edit" here to distinguish the difference?
views.py:
@view_config(context=Root, route_name='serve_route')
def plot_view(context, request):
...
@view_config(context=Root, renderer='bunseki:templates/form.pt', route_name='edit_route')
def edit_view(request):
...
Run Code Online (Sandbox Code Playgroud)
我金字塔手册我找不到参考如何在路线中设置参数.我想指向一些文档或示例的指针就足够了,我可以自己弄清楚细节.谢谢!
如果我没有选择文件而只是点击"提交",我会收到以下错误: -
Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"}
Run Code Online (Sandbox Code Playgroud)
这不是我在变形演示站点上获得的行为,其中将其留空会导致更合理的"必需"错误消息.
使用我自己的验证器如下所示无法解决问题: -
def validate_file(node, value, **kwargs):
if not value:
raise colander.Invalid(node, "Please select a file")
class Schema(colander.MappingSchema):
excel_file = colander.SchemaNode(deform.FileData(),
widget=deform.widget.FileUploadWidget(tmpstore),
validator=validate_file)
Run Code Online (Sandbox Code Playgroud)
我可以看到错误被引发,但是e.render()e是ValidationFailurefrom 的输出form.validate与错误本身不匹配.相关的deform源代码位于"widget.py"中,其中_FieldStorage类检查是否cstruct具有file属性并引发它自己的Invalid异常.
这是执行验证调用的函数(实际上是bog标准的东西),它返回渲染的页面.
def generate_upload_form(request):
form = deform.Form(upload_schema, buttons=('submit',))
if getattr(request, 'POST') and 'submit' in request.POST:
try:
value_dict = form.validate(request.POST.items())
except deform.ValidationFailure as e: # Invalid form
form …Run Code Online (Sandbox Code Playgroud) 在渲染时如何阻止 Deform 在字段标题或描述中转义 HTML?我目前最好的解决方案是用我需要的东西搜索/替换返回的呈现的 HTML 字符串。
默认情况下,变形会将所有 HTML 字符转义为 HTML 实体,我想在其中一个字段描述中添加一个标签。
我正在使用Pyramid框架并使用Deform包来呈现HTML表单,并给出了漏勺方案.我正在努力解决如何处理具有多对多关系的模式的问题.例如,我的sqlalchemy模型如下所示:
class Product(Base):
""" The SQLAlchemy declarative model class for a Product object. """
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
description = Column(String(2000), nullable=False)
categories = relationship('Category', secondary=product_categories,
backref=backref('categories', lazy='dynamic'))
class Category(Base):
""" The SQLAlchemy declarative model class for a Category object. """
__tablename__ = 'categories'
id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
products = relationship('Product', secondary=product_categories,
backref=backref('products', lazy='dynamic'))
product_categories = Table('product_categories', Base.metadata,
Column('products_id', Integer, ForeignKey('products.id')),
Column('categories_id', Integer, ForeignKey('categories.id'))
)
Run Code Online (Sandbox Code Playgroud)
如您所见,这是一个非常简单的模型,代表一个在线商店,其中一个产品可以属于一个或多个类别.在我的渲染形式中,我想有一个选择多个字段,我可以在其中选择几个不同的类别来放置产品.这是一个简单的漏勺模式:
def …Run Code Online (Sandbox Code Playgroud) 我正在Deform/Colander中实现一个简单的'tick to agree条款和条件框'.
因此,我只想检查该复选框是否有错误信息"你必须同意T&C".
我明白我可以用:
colander.OneOf([True])
Run Code Online (Sandbox Code Playgroud)
确保勾选方框.但是,OneOf不允许自定义错误消息.这样做的正确方法是什么?
我刚刚开始在我的一个项目中使用Pyramid,我有一个案例,我需要验证表单字段输入,通过获取表单字段值并进行Web服务调用来断言值的正确性.例如,有一个名为银行CUSTOMER-ID的字段.我需要将(单独)作为输入并通过进行Web服务调用(如http://someotherdomain/validate_customer_id/?customer_id=<input_value>)来在服务器级别进行验证.
我正在使用Colander进行表单模式管理,并使用Deform进行所有表单验证逻辑.我很困惑我需要在CUSTOMER-ID案例中放置验证逻辑.它是MySchema().bind(customer_id=<input_value>)(它有一个查询web服务的延迟验证器)或form.validate(request.POST.items())?如果我采用延迟验证器的路径,则会因错误的CUSTOMER-ID MySchema().bind而引发colander.Invalid错误.没关系.但是,该错误不是在表单级别,而是在模式级别.那么我该如何以理智的方式告诉用户这个呢?
我对Django表单有很好的经验,所以我期待像clean方法一样.像form ['customer_id']这样的表单错误.错误是我在模板级别所期望的.Pyramid的Deform还是Colander有可能吗?
使用变形制作表单,并希望根据用户的选择更改pageShema类.防爆.如果他从selectwidget中选择选项1,则向他显示一组字段,如果是其他选择的情况 - 另一个.这该怎么做?