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

我有一个基本的模型:

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

现在,我想要的场景是:

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

一些额外要求:

>我希望无需重新加载页面即可显示“你的意思”列表.
>如果用户单击我想要执行表单操作的其中一个建议而不进行其他查找 – 该值已经过检查.
>我希望将所有逻辑保留在视图之外,并将其保留在表单或模型中.这是必须的.
>我想避免模板中的硬编码js并尽可能将其推入表单中.这不是必须的.

所以我假设它将全部分配在这个字段验证和一个自定义小部件之间,它将处理“你是说”列表呈现.我不能把它们放在一起.

你需要帮助:)

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

最佳答案

  1. I would prefer the “did you mean” list to be displayed without
    having to reload the page.

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

  1. If a user clicks on one of the suggestions I want to perform the
    form’s action without an additional
    lookup – the value has already been
    checked.

同样,单击该窗口小部件时,应该只提交表单.

  1. I want to keep all the logic outside the view and keep it in the
    form or in the model. This is a must.

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

  1. I want to avoid hardcoded js in the template and push it into the form if
    possible. It’s not a must.

解决了自定义小部件,details.

点赞