【问题标题】:How to call a model method, using the object as parameter in Django?如何在Django中使用对象作为参数调用模型方法?
【发布时间】:2016-11-28 06:25:29
【问题描述】:

我想在我的模板上生成一个表格,显示我从 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

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

模板.html

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    当您编写模型方法时,您将self 作为参数传递,这显然是指实例本身。把你的模型方法改成这样的

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

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

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

    【讨论】:

      【解决方案2】:

      我没有完全理解你的问题,你为什么不能直接将 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.

      【讨论】:

      • 当我尝试时我收到此错误消息:> 无法解析剩余部分:'task.check_if_finished(task.task_id)'中的'(task.task_id)'
      • 哦,这是模板错误。我刚刚查了一下,似乎你不能在 Django 模板中调用带有参数的函数/方法。您需要创建一个自定义模板标签 (docs.djangoproject.com/en/dev/howto/custom-template-tags/…),或者在视图中进行检查并将正确的值发送到模板中。
      • 对于我的Task.objects.all(),我想通过 API 请求检查任务是否完成。然后我想在表格中显示这个任务是否完成。
      • 我更愿意在视图上执行此操作,但我不知道该怎么做。 ` """列出所有用户任务。""" tasks_from_user = Task.objects.all().filter(user=request.user) return render_to_response('vix/list.html', RequestContext(request, { 'request' : 请求, 'tasks_from_user': tasks_from_user })) `
      • 我想说最简单的事情是发出 API 请求,检查它是否完成,然后将该值发送到模板中,例如 is_finished,然后执行 {{is_finished}} 或用 if 包装那个。
      猜你喜欢
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多