模型和验证混乱 - 寻求建议

时间:2009-03-03 15:15:17

标签: python django validation

我对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说这应该是一种方法吗?

4 个答案:

答案 0 :(得分:4)

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

请参阅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网页输入代码并查看其功能。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

查看管理网站上的文档,特别是the form attribute of ModelAdmin

答案 3 :(得分:0)

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

我对你的问题很困惑,所以我假设你应该问'我应该在哪里捕获输入错误? '给自己。

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

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