2015-01-15 30 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