среда, 26 июня 2013 г.

Настройка роутов, путей в urls.py фреймворка Django

Пусть мы только что создали проект project. В нем сделали приложение articles, в котором намереваемся хранить статьи. При этом мы хотим, чтобы при обращении в браузере по адресу http://127.0.0.1:8000/ у нас загружались urls.py этого приложения articles.

Вот главные роуты проекта: project/urls.py:

# ... начальные настройки

urlpatterns = patterns('',
    # подключаем настройки роутов приложения article
    url(r'', include('article.urls')),

    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    url(r'^admin/', include(admin.site.urls)),
)

четверг, 6 июня 2013 г.

'ManyRelatedManager' object is not iterable

Чтобы исправить эту ошибку, не нужно делать в шаблоне так:

{% for contest in winner.contest %}
    {{ contest.title }}
{% endfor %}

Нужно делать так:
{% for contest in winner.contest.all %}
    {{ contest.title }}
{% endfor %}

Это выражение winner.contest.all позволяет в шаблоне Django получить все элементы связанной модели (тип связи ManyToMany).
Вот так выглядит модель Winner:
class Winner(models.Model):
    # ... поля модели
    # значения этого поля мы хотели получить в шаблоне
    contest = models.ManyToManyField(Contest, verbose_name=u'Конкурс')


понедельник, 3 июня 2013 г.

Статический метод модели в Django: @staticmethod, @classmethod

Представим, что в нашем Django-проекте есть модель Конкурс (Contest). Конкурс ежегодный, поэтому характеризующая его модель будет иметь атрибут year.
Как же нам в классах представлений получить год последнего прошедшего конкурса?
Конечно! Написать для модели Contest метод, который будет возвращать этот год.
Метод должен быть статическим, т.е. для его вызова нам вовсе будет не нужно создавать экземпляр класса Contest.

Reverse for '*' with arguments '()' and keyword arguments '{u'pk': ''}' not found

Ошибка эта была получена, когда я попытался вывести на страницу список коллекций одежды для определенного года. Причина этой ошибки в том, что в шаблоне тэг {% url ... %} получал для pk пустое значение. В сообщении об ошибке был показан проблемный фрагмент шаблона:

{% for collection in collection_list %}
<li>
    <a>
        {{ collection.title }}
    </a> ( {{ collection.author.all|join:', ' }} )
</li>
{% endfor %}

среда, 29 мая 2013 г.

Отладка приложений в Django

Если в PHP, чтобы узнать значение переменной в том или ином месте кода, мы применяем echo, var_dump( ), print_r( ), то в фреймворке Django в коде моделей (models.py) или представлений (views.py) мы можем два метода: print и assert False, myvar

суббота, 25 мая 2013 г.

Показать название ManyToMany полей в админке Django

Есть у нас модель Collection. Коллекция может быть задействована в нескольких номинациях, поэтому связь здесь ManyToMany.

В админке эта модель будет отображаться так:


 Чтобы колонка появилась, нужно проделать пару шагов...

Как получить из списка первый элемент в шаблоне Django

Имеется модель Коллекция. У коллекции может быть несколько фотографий. Возникла необходимость в шаблоне, в котором уже получен список фотографий коллекции выводить только первую фотографию. Как это сделать?

1. В шаблоне Django можно проделать манипуляцию с тэгом with и фильтром first:

{% with attachments_list|first as attachment %}

    

{{ attachment.filename }}

{% endwith %}

2. Непосредственно обратиться к элементу списка по индексу. Это позволяет отобразить элемент с любым индексом:

{% with attachments_list.0 as attachment %}

    

{{ attachment.filename }}

{% endwith %}