Django - 基于验证的“你是说”提示的自定义小部件

时间:2010-01-27 14:33:25

标签: ajax django forms widget

我有一个基本模型:

class MyModel(models.Model):
    my_field = models.CharField()

我有这个模型的基本表单:

class MyFrom(forms.ModelForm):
    class Meta:
        model = MyModel

我有一个执行基本查找的功能(实际上更复杂,正则表达式等不会这样做):

POSSIBLE_VALUES = ['aa', 'bb', 'cc', 'dd']

def lookup(some_value):
    if some_value in POSSIBLE_VALUES:
        # the value is OK, return a string
        return some_value
    else:
        # constructs the 'did you mean' list of suggestions
        didyoumean = [pv for pv in POSSIBLE_VALUES if pv in some_value]
        # returns a list which might be empty
        return didyoumean

现在,我想要的方案是:

  1. 在网站上,我在“my_field”输入字段中输入一个值,然后点击“提交”按钮。
  2. 如果值通过查找,我应该自动执行表单的操作。
  3. 如果我获得了多个可能的值,那么我应该将它们显示给用户,而不执行任何其他操作。
  4. 如果我没有得到答案(空列表),我应该收到一条错误消息。
  5. 其他一些要求:

    1. 我希望无需重新加载页面即可显示“你的意思”列表。
    2. 如果用户点击我想要执行表单操作的其中一个建议而没有额外的查找 - 该值已经被检查过。
    3. 我希望将所有逻辑保留在视图之外,并将其保留在表单或模型中。这是必须的。
    4. 我想避免在模板中使用硬编码的js,并尽可能将其推入表单中。这不是必须的。
    5. 所以我假设它将全部分配在这个字段验证和一个自定义小部件之间,它将处理“你是说”列表呈现。我不能把它们放在一起。

      需要您的帮助:)

      修改。广告。 2要求。 这是我描述的基本功能。在更高级的一个中,我希望这个表单有更多的字段,因此“你的意思”列表应该与所有其他字段错误一起显示(如果有的话)。然后单击提示只会将my_field的值设置为它的值而无需重新加载表单。用户还必须更正其他错误,因此我无法立即执行表单操作。可能只有一些标志可以在这两个选项之间切换(“基本”和“高级”)。

1 个答案:

答案 0 :(得分:2)

  
      
  1. 我更希望没有显示“你的意思”列表   必须重新加载页面。
  2.   

创建自定义窗口小部件,使用JS代码呈现,以便在用户输入时检查可能的值

  
      
  1. 如果用户点击了我要执行的其中一项建议   表格的行动没有额外的   查找 - 该值已经存在   检查。
  2.   

同样,该小部件在点击时应该只提交表单。

  
      
  1. 我希望将所有逻辑保留在视图之外并将其保留在视图中   形式或模型。这是必须的。
  2.   

在表单上,​​您将使用clean()方法来验证所有内容。例如,如果某些虚假数据通过p提交。 2 - 您仍然会提出验证错误。

  
      
  1. 我想避免在模板中使用硬编码的js并将其推入表单中   可能。这不是必须的。
  2.   

使用自定义窗口小部件details解决。