Возвращение значений из методов в Django - PullRequest
0 голосов
/ 27 июня 2010

Итак, время для вопроса новичка, но очень важного, поскольку документация, похоже, пропустила этот очень простой пример.

Все, что я пытаюсь сделать, это вернуть значение из модели в представление в 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})

И ничего не отображается. Я получаю это сообщение об ошибке с

...

Самое смешное, что если я пропущу функции и так далее и создам модель, подобную этой

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

И назовите это с

start = Page.ex

Все хорошо.

Будем весьма благодарны за любой указатель или рабочий пример! Спасибо

Ответы [ 3 ]

1 голос
/ 27 июня 2010

Подобные вещи совершенно не включены в учебник по Django, поскольку они не имеют ничего общего с Django.Если вы не знаете базовый язык Python, вам нужно следовать руководству по Python.

Главное, что неправильно в приведенном вами коде, это то, что вы на самом деле не вызывали метод index, вы только что сослалиськ этому.В Python, как и во многих других языках, для вызова метода необходимо использовать method().Итак, вам нужно:

Page.objects.all()[0].index()
0 голосов
/ 27 июня 2010

В 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() возвращает массив объектов Page, для которых метод row_method() не определен.

Эти методы основаны на строках , потому что они действуют в строкеуровень (одна строка в таблице БД и, следовательно, один экземпляр относительного класса модели).

Методы на основе таблицы:

Вы также можете определить методы, связанные сконкретный тип модели, а не конкретный экземпляр с помощью менеджеров.Вы можете найти документацию по Менеджеру здесь: http://docs.djangoproject.com/en/1.2/topics/db/managers/

Этот тип методов доступен при управлении коллекцией объектов Page, например, вы можете написать:

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

В этом случаеМетод имеет доступ к коллекции объектов Page, возвращаемых запросом, и, в моем примере, он вычисляет сумму длины всех заголовков всех объектов Page, найденных запросом.

0 голосов
/ 27 июня 2010
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'

затем вы создаете атрибут класса, к которому можно получить доступ в классе и в каждом экземпляре этого класса (он используется всеми этими объектами). Это не атрибут экземпляра.

...