2015-01-15 74 views

回答

2

当前有three different function prototypes可用于自定义验证程序。以下是使用带两个参数(文档链接中的选项5)的原型的自定义日期字符串验证程序的示例。此类型必须返回字段(反过来说,它有可能改变的价值的能力在存储前)的终值:

import ckan.plugins as plugins 
import ckan.plugins.toolkit as tk 
from ckan.plugins.toolkit import Invalid 

def date_str_validator(value, context): 
    valid_date = tk.get_validator('isodate')(value, context) 
    if not valid_date or not isinstance(valid_date, datetime.datetime): 
     raise Invalid("Invalid date") 
    return value 

class MyPlugin(plugins.SingletonPlugin, tk.DefaultDatasetForm): 

    plugins.implements(plugins.IDatasetForm, inherit=False) 

    def _modify_package_schema(self, schema): 
     schema.update({ 
      # Custom extras 
      'origination_date':[tk.get_validator('ignore_missing'), 
           date_str_validator, 
           tk.get_converter('convert_to_extras')] 
     }) 
     return schema 

    def create_package_schema(self): 
     schema = super(MyPlugin, self).create_package_schema() 
     schema = self._modify_package_schema(schema) 

     return schema 

    def update_package_schema(self): 
     schema = super(MyPlugin, self).update_package_schema() 
     schema = self._modify_package_schema(schema) 
     return schema 

    def show_package_schema(self): 
     schema = super(MyPlugin, self).show_package_schema() 

     schema.update({ 
      # Custom extras 
      'origination_date':[tk.get_converter('convert_from_extras'), 
           tk.get_validator('ignore_missing'), 
           date_str_validator] 
     }) 

     return schema 

注意,验证器和转换器调用顺序,所以这里的顺序显示的是在_modify_package_schemashow_package_schema中都很重要。

+0

验证器的顺序是否影响在表单提交中显示验证错误的顺序?根据我的经验,似乎不是。我试图弄清楚如何使验证错误以与页面上显示的字段(它们是自定义域和默认域的组合)相同的顺序出现。 – littleK 2017-10-05 03:22:03