【问题标题】:Model and Validation Confusion - Looking for advice模型和验证混淆 - 寻求建议
【发布时间】:2010-10-11 01:03:16
【问题描述】:

我对 Python、Django 还有些陌生,我想要一些关于如何布局我想编写的代码的建议。

我编写了允许上传文件的模型。在模型保存方法中,我正在检查文件是否具有特定扩展名。如果它具有 XML 扩展名,我将打开文件并从文件中获取一些信息以保存在数据库中。我有这个模型工作。我已经在内置管理中对其进行了测试。它有效。

当前,当出现错误时(它不是 XML 文件;无法打开文件;特定属性不存在)我会抛出自定义“异常”错误。我想要想要做的是如何将这些“异常”错误消息传递给视图(无论是自定义视图还是内置管理视图)并显示错误消息,就像表单一样正在使用库。这可能吗?

我开始认为我将不得不使用表单库再次编写验证检查。如果是这种情况,是否仍然可以使用内置管理模板,但扩展它使用的表单来添加这些自定义验证?

任何能帮助我解决困惑的事情都将不胜感激。


更新:

到目前为止,这是我的模型,对于那些询问的人,“nzb”是 XML 文件字段。
http://dpaste.com/hold/6101/

管理界面将使用您与模型关联的表单;您自己的观点也可以使用该表单。

这正是我想做的。但是,我不知道如何将我的表单与我的模型相关联。过去,当我创建表单时,它们总是充当自己的实体。在使用 ModelForm 类时,我永远无法让管理视图使用它们。您能对此有所了解吗?

我已经阅读了你给我的链接,这似乎是我过去所做的,没有运气。

从文件中获取属性,应该是一个方法吧。

抱歉,您能详细说明一下吗?方法在哪里?


更新:

似乎我完全错过了将表单链接到管理视图的这一步。 http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin

这现在应该允许我在表单中进行验证。但是,我仍然对如何实际处理验证感到困惑。 S.Lott 说应该是一种方法?

【问题讨论】:

    标签: python django validation


    【解决方案1】:

    表单错误自动成为管理视图的一部分。

    http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation

    如果您在表单中进行验证,您会感到最开心——这就是表单的用途。管理界面将使用您与模型关联的表单;您自己的观点也可以使用该表单。

    从文件中获取属性,应该是模型类的单独方法。模型类的分离方法可以被模型类的save()方法使用,也可以在其他时候被视图函数调用。


    “在使用 ModelForm 类时,我永远无法让管理视图使用它们。”

    http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form

    http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin


    “我仍然对如何实际处理验证感到困惑。S.Lott 说它应该是一种方法?”

    表单中的验证是使用clean() 方法或clean_somefield() 方法完成的。

    “向管理员添加自定义验证”链接(上方)显示了如何将 clean_name 方法添加到“MyArticleAdminForm”表单。

    如果您仍然感到困惑,请尝试从 Django 网页中实际输入代码并查看它的作用。

    【讨论】:

    • 我已经用更多信息更新了我的问题。你能再看看吗?你很清楚我想做什么,但是我仍然不太知道该怎么做。具体来说,将表单与模型相关联,并让管理部门了解模型表单的验证错误。
    【解决方案2】:

    我想最好的方法是实现一个特殊的字段类,该类扩展 FileField 并自定义验证上传的文件。

    验证在字段的clean 方法中实现。它应该检查 XML 文件并在遇到错误时引发 ValidationErrors。然后,管理系统应该像对待任何其他字段错误一样对待您的自定义错误。

    ImageField 类是这种特殊验证的一个很好的例子——我推荐just reading through the source

    【讨论】:

    • 啊,我明白了。所以 ImageField 类只是 FileField 类的一个扩展,但是有额外的验证?有趣的!不过,我必须在 Clean 方法中打开 XML 文件进行验证,然后再在 Save 方法中实际获取数据,不是吗?
    【解决方案3】:

    您可以提供管理站点将使用的表单。然后,您可以在管理区域中显示的表单代码中执行验证。

    请参阅管理站点上的文档,尤其是 the form attribute of ModelAdmin

    【讨论】:

      【解决方案4】:

      “我正在抛出一个自定义的“异常”错误“ - 你到底在哪里抛出异常?在您的模型中还是在您的视图中?

      我对您的问题感到困惑,所以我假设您应该问“如果有输入错误,我应该在哪里捕获输入错误? '给自己。

      我看到的模型和视图就像一条小装配线上的零件。 视图/表单验证是应该执行的第一个操作。如果通过表格输入数据有任何问题。应该使用 form.is_valid() 等在表单级别防止它。

      除了执行 CRUD 之外,模型的功能应该是提供有关实体本身的元信息。理想情况下,它不应该为 CRUD 操作获取的数据而烦恼。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 2011-07-04
        • 1970-01-01
        • 2018-06-04
        • 2020-10-10
        • 1970-01-01
        • 2014-08-26
        相关资源
        最近更新 更多