Django - kwargs没有通过

时间:2015-09-19 03:11:26

标签: python django

我在Django中编写一个应用程序,旨在检查XML是否存在错误。它解析XML文件中的每一行,创建一个对应于该行的对象(来自一个名为XMLElement的类),检查行是否有错误,生成一个详细说明错误的字符串,然后将其附加到列表中。这是它的作用的代码片段:

try:
        self.string_list = kwargs['tag_string'].replace("<", "").replace(">", "").split()
        print self.string_list
        self.element_name = self.string_list[0]
    except (ValueError, IndexError) as e:
        self.errors.append("XMLElement {0} contains an error:{1}".format(self.element_name, str(e)))

然后,在完成解析文件之后,调用函数的模型类将所有错误连接成一个字符串,然后创建一个带有该字符串作为关键参数的对象。

    print '\n'.join(obj.errors)
    err_obj = Errors(errors='\n'.join(obj.errors))
class Errors(models.Model):
    errors = models.TextField()

每当我从XMLElement实例打印错误列表时,都会正确打印错误。但是,当我尝试使用来自django shell的Errors.objects.all()[n].errors从错误类中打印错误时,它会返回一个空的unicode字符串。不仅如此,它不是保存一个错误对象,而是保存多个,在3到5之间的任何地方。我的代码的哪个部分可能导致这个?

Gist link to the entire file

2 个答案:

答案 0 :(得分:0)

关于使用save方法的无用答案。不是吗。

根据您的评论进行更新:您的代码中有很多区域可能导致此行为,主要原因可能是因为您覆盖了__init__()。在Django中非常不鼓励覆盖该方法,因为该框架使用许多方法来初始化不在您控件中的实例,并且还为许多不同的东西初始化模型。如果需要自定义实例创建,请创建自己的create()类方法。

我在你的代码中看到了很多东西(这更像是关于你如何使用框架的评论而不是其他任何东西)是你在这些事情上非常轻松地使用Model超类你并不像你的XMLElement课那样坚持:初始化后的回归可能会给框架带来很多问题。

我的解决方案是你应该检查你的算法在框架之外的行为,然后决定你需要持久化什么,占用数据库的空间,然后将你的代码包装在Django类和为了您自己,请停止覆盖(最重要的是,在其他对象中创建其他对象)init方法。

答案 1 :(得分:0)

我终于能够解决这个问题了。做两件事:

我做的第一件事是将XMLElement类的超类从models.Model更改为object。这解决了我的大部分问题。但是,它无法解决我的__init__类的UserFile函数创建多个对象的问题。我通过将Errors对象从UserFile.__init__创建到views.py

中名为check的函数来解决此问题