如何调用模型方法,在Django中使用对象作为参数?

时间:2016-07-25 02:14:08

标签: python django

我想在我的模板上生成一个表,显示我从Task类中声明的方法获得的一些数据

models.py

class Task(models.Model):
...
def check_if_finished(self):
    resp = requests.get(
     'http://my.rest.api/tasks/view/{}'.format(self.task_id))
    resp_data = resp.json()
    resp_finished = resp_data['task']['started_on']
    if resp_finished is None:
        return False
    else:
        return resp_finished

我知道在模板上调用方法没有任何意义,但是我需要用什么来显示这些数据呢?

template.html

  

{{task.is_finished(task.task_id)}}

2 个答案:

答案 0 :(得分:1)

当你编写一个模型方法时,你传递self作为参数,这显然是指实例本身。将您的模型方法更改为此类

class Task(models.Model):
    fields
    def is_finished(self):
        return appropriate boolean from here

现在,在您的模板中,您可以将其简单地用作{{ task.is_finished }}。请注意,我没有传递任何id作为参数。这是因为,在编写模型方法时,您将self作为参数传递,该参数引用了正在调用哪个方法的实例。

我希望这对你有意义,并帮助你以简单的方式理解模型方法。

答案 1 :(得分:0)

我不完全理解你的问题,为什么你不能将task_id作为参数发送?

class Task(models.Model):
...
def check_if_finished(self, task_id):
    resp = requests.get(
     'http://my.rest.api/tasks/view/{}'.format(task_id))
    resp_data = resp.json()
    resp_finished = resp_data['task']['started_on']
    if resp_finished is None:
        return False
    else:
        return resp_finished

然后随时调用它:

  

{{task.check_if_finished(task.task_id)}}

还可以使task_id成为可选参数。

def check_if_finished(self, task_id=None):
    task_id = task_id or self.task_id   
    resp = requests.get...

我不确定为什么你不想在实例上使用task_id。如果你永远不会那么它应该是一个静态的方法吗?

@staticmethod
def check_if_finished(cls, task_id): 
    ...

我认为Django模型不会阻止任何这些选项。希望有一些有用的东西,否则我需要更多的信息和你想要完成的事情。

编辑:Django模板不允许使用参数调用函数/方法。您需要create a custom template tag或只是在视图中调用该函数并将结果发送到模板。 See previous question