0

我想从模型的保存方法中触发视图函数,以便写入或更新与实例关联的 xml 文件。

#models.py
from myapp.views import updateXML, createXML

class myModel(models.Model):

    def save(self, *args, **kwargs):
        if self.pk is not None:
            updateXML(self)
        else:
            createXML(self)
        super(FatherAgendaTemplate, self).save(*args, **kwargs)

#views.py
from myapp.models import otherModel

def createXML(instance):       
    print "create XML"
    print instance

def updateXML(instance):     
    print "update XML"
    print instance

问题是我需要将 otherModel 导入到具有 myModel 外键的 views.py 中,这会导致某种冲突,并且出现错误:

ImportError: cannot import name createXML

我想我的做法是错误的,像这样在模型和视图之间导入,因为它会引发导入错误。这样做的正确方法是什么?当然,我可以在 models.py 中完成所有的 xml 编写功能并避免导入冲突,但这似乎是一种混乱的方法。

4

2 回答 2

2

createXML和功能是否updateXML特定于该特定模型?如果是这样,看起来很可能,那么最好的办法是让它们在myModel

class MyModel(models.Model):
    ...fields...


    def createXML(self):
        ... do stuff with self ...

    def save(self, *args, **kwargs):
        if not self.pk:
            self.createXML()

等等。对我来说,这是迄今为止最好的解决方案,而且一点也不凌乱。

但是,如果这真的不适合您,有很多方法可以避免导入问题。或许最好的办法是将 XML 函数放入名为 eg 的第三个模块中,lib.py您可以将其导入您的模型中。

第三种选择是在 save 方法本身中导入 XML 函数,而不是在模块级别:

def save(self, *args, **kwargs):
    from myapp.views import createXML, updateXML

但是我认为前两个选项会更可取。

于 2011-03-25T09:40:24.270 回答
1

首先,在发布此类问题时,发布或链接到所有相关代码(即 MyOtherModel)和完整的回溯非常重要。

跟踪导致错误的回溯可以帮助您找出为什么会收到 ImportError,这可能与您认为可能是您的问题无关。

第二个问题:那些是django视图还是普通函数?视图接受请求(带或不带参数)并应返回 Response 对象。

一般来说,操作或与对象交互的函数(在这种情况下是在您的模型中)应该是对象内部的函数,即所谓的方法,并且视图应该调用这些方法。

class MyModel(models.Model):
    name = models.CharField...
    somethingelse = models.TextField...

    my_method_to_create_pdf(self):
        create_pdf(self.somethingelse)

如果不仅在这里使用 create_pdf,请在第三个文件中创建一个库并在此处导入,但将与模型有关的任何逻辑作为方法,因为对象应该是自包含的。

python中面向对象编程的快速谷歌链接:http ://www.voidspace.org.uk/python/articles/OOP.shtml

干杯,灰

于 2011-03-25T09:43:23.857 回答