从Django中的方法返回值

时间:2010-06-27 11:14:32

标签: django django-models django-views

所以,新手问题的时间非常重要,因为文档似乎错过了这个非常基本的例子。

我所要做的就是将模型中的值返回到Django中的视图。这是一些代码。

模型

class Page(models.Model):
    def index(self):
      ex = 'foo string'
      return ex

视图

def index(request):
    start = Page.objects.all().index
    #start = Page.index
    return render_to_response('index.html', {'page_content': start})

并且,没有任何东西被渲染。我使用< unbound方法Page.index>

得到此错误消息

...

有趣的是,如果我跳过功能等等并创建像这样的模型

class Page(models.Model):
    ex = 'goo string'

并用

调用它
start = Page.ex

一切都很好。

非常感谢任何指针或工作示例! 感谢

3 个答案:

答案 0 :(得分:1)

这种事情在Django教程中被遗漏了,因为它与Django无关。如果您不了解基本的Python,那么您需要学习Python教程。

你给出的代码的主要问题是你实际上没有调用索引方法,你刚刚提到它。在Python中,与许多其他语言一样,要调用方法,您需要使用method()。所以你需要:

Page.objects.all()[0].index()

答案 1 :(得分:0)

Page.objects.all()

返回一组Page对象的查询,而不是单个Page对象。您可以拨打Page.objects.all()[0].index

为了正确渲染,我相信您应该将Page.objects.all()传递给模板,然后在模板中迭代它,如下所示:

{% for page in page_content %}
  {{ page.index }}
{% endfor %}

如果您定义这样的属性:

class Page:
  ex = 'some char'

然后你创建了class属性,可以在类中和该类的每个实例中访问它(它由所有这些对象共享)。这不是实例属性。

答案 2 :(得分:0)

在Django中,您有两种类型的自定义数据库对象方法:基于行(或实例)的方法,基于表的方法。

基于行的方法:

您只需在模型类中定义一个方法:

class Page(models.Model):
    def row_method(self):
        return "Row method working on Page object with id " + str(self.id)

这个方法是从一个Page对象调用的!

所以你可以这样做:Page.objects.all()[0].row_method(),但是你不能Pages.objects.all().row_method因为Pages.objects.all()返回一个没有定义row_method()方法的Page对象数组。 / p>

这些方法是基于行的,因为它们在行级别(DB表中的单行,因此是相对模型类的单个实例)中起作用。

基于表格的方法:

您还可以使用Managers定义与特定模型类型相关的方法,而不是特定实例。您可以在此处找到有关管理器的文档:http://docs.djangoproject.com/en/1.2/topics/db/managers/

管理页面对象的集合时可以使用这些类型的方法,例如,您可以编写:

Page.objects.filter(title__startswith='The').calculate_total_title_length()

在这种情况下,该方法可以访问从查询返回的Page对象集合,在我的示例中,它计算查询找到的所有Page对象的所有标题长度的总和。