【问题标题】:Django: validating forms declared on client side with angularjsDjango:使用 angularjs 验证在客户端声明的表单
【发布时间】:2014-08-03 16:22:28
【问题描述】:

我想复制类似于 ModelForm 的东西,但在很多情况下(通过字典数组)。

如果我们有

models.py

 Article(models.Model):
     title = models.CharField()
     author = models.CharField()

和modelforms.py

ArticleForm(ModelForm):
    class meta:
        model = Article

我可以的

>> form = ArticleForm({"title": "example title", "author": "example author"})
>> form.is_valid()
True

现在,假设我有一个字典数组 [{"title": "example title 1", "author": "example author 1"}, {"title": "example title 2", "author": "example author 2"}, {"title": "example title 3", "author": "example author 3"}] 通过 post 调用传递,我想使用传递的信息进行表单验证。

有没有办法一次性完成所有操作,如果所有这些都有效,我可以这样做?还是使用模型表单进行列表理解是我最好的解决方法?我知道表单集,但我正在使用客户端表单并希望在服务器端验证表单。

【问题讨论】:

    标签: python django validation formset


    【解决方案1】:

    或者使用模型表单进行列表理解是我最好的解决方法?

    是的,或者maps 和filters:

    valid_forms = filter(lambda fm: fm.is_val(), 
                         map(ArticleForm, some_list_of_dictionaries))
    

    如果您使用的是 Python3,这将返回一个生成器对象,您可以对其进行迭代,也可以立即使用以下内容进行评估:

    valid_forms = list(filter(lambda fm: fm.is_val(), 
                              map(ArticleForm, some_list_of_dictionaries)))
    

    如果您只想了解它们是否都有效,您可以这样做:

    all_forms_are_valid = all(lambda fm: fm.is_val(), 
                              map(ArticleForm, some_list_of_dictionaries))
    

    但是,如果您想稍后访问它们(并且您使用的是 Python3),那么列表推导式似乎是一种更好的方法,因为否则您将低效地构建相同的生成器对象两次。

    用问题编辑:

    map(ArticleForm, some_list_of_dictionaries)[ArticleForm(dict) for dict in some_list_of_dictionaries] 有什么区别吗?

    这取决于您是否使用 Python3。在 Python3 中,map 将返回一个生成器,而在 Python2 中,它将评估表达式(返回一个 list),而两者都将评估列表理解中的完整列表。

    在 Python3 中,执行以下操作可能有一些优势:

    valid_forms = filter(lambda fm: fm.is_valid(),
                         map(ArticleForm, some_list_of_dictionaries))
    

    因为您最终会得到一个生成器,该生成器通过它提取数据,而不是首先使用 map 评估到一个列表中,然后使用 filter 评估到另一个列表中。

    编辑 2:

    忘了提一下,您可以使用括号将列表推导转换为生成器:

    all_valid = all(ArticleForm(fm).is_valid() for fm in some_list_of_dictionaries)
    

    【讨论】:

    • map(ArticleForm, some_list_of_dictionaries) 和 [ArticleForm(dict) for dict in some_list_of_dictionaries] 有区别吗?
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2013-04-16
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多