我对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说这应该是一种方法吗?
答案 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操作获得的数据而烦恼。