Django

Материал из Xgu.ru

Перейти к: навигация, поиск

Django — веб-фреймворк написанный на Python и для использования с Python. Опубликован в 2005 году. Иногда считается аналогом Ruby on Rails в мире Python, что верно только отчасти. Имеет свой ORM и язык шаблонов.

Содержание

[править] Модель

  • Models (англ.) — Модель в Django: введение в вопрос
  • Models (англ.) — Модель в Django: Справочная информация
  • Making queries (англ.) — Запросы к СУБД средствами Django

[править] Формы

[править] Функции-сокращения (shortcut functions)

Функции, которые покрывают несколько уровней MVC, и предназначены для выполнения типовых, наиболее распространённых в Django задач:

  • render
  • render_to_response
  • redirect
  • get_object_or_404
  • get_list_or_404

Подробнее:

[править] Управление Django-проектом

Управление проектом осуществляется с помощью скриптов

   $ django-admin.py <command> [options]
   $ manage.py <command> [options]

которые фактически являются одним и тем же скриптом, но только с несколькими предустановленными в случае manage.py.

Подробнее:

[править] Полезные Django-приложения

[править] South

Инструмент для безостановочной изменения схемы базы данных Django. Без South (или аналогичного инструмента) такие простейшие задачи как добавление или удаление полей в модели могут стать трудновыполнимыми. С South они происходят абсолютно незаметно.

[править] django-debug-toolbar

Настраиваемые панели с различной отладочной информацией.

[править] django-extensions

Множество маленьких приятных расширений Django,

[править] django-annoying

Ещё одно множество приятных расширений Django. Убирают (уменьшают) вещи, которые в джанго раздражают.

[править] django-chunks

Куски шаблонов, которыми можно управлять через django admin interface.

[править] django-piston

Библиотека для построения программных API на Django.

[править] python-social-auth

Библиотека для аутентификации на сайте с помощью аккаунта социальной сети или другого провайдера аутентификации.

Поддерживает не только Django, но и другие фреймворки:

[править] Mezzanine

CMS, построенный на основе Django. Можно сказать, что это Wordpress, сделанный на Django.

[править] Полезные советы

  • Используйте относительные пути в конфигурации, не используйте абсолютных
  • Используйте тег {% url %} вместо URL-ов в шаблонов
  • Используйте django-debug-toolbar


[править] Вопросы и ответы

[править] Как быстро пересоздавать базу для приложения Django?

Во время разработки вам часто приходится менять модель данных. Изменения эти не отражаются автоматически на базе данных. Схема автоматически не меняется.

Есть несколько способов решения этой проблемы:

  1. Использовать средство для миграции, например, South (более правильный способ);
  2. Пересоздать базу (более простой способ).

Если данные не нужны, базу можно убить и пересоздать заново:

   $ rm myproject/database/database.sqlite3 
   $ ../bin/python manage.py syncdb --noinput

В этом случае при инициализации базы нужно будет вводить имя и пароль суперпользователя — пересоздание не будет полностью автоматическим.

Для того чтобы облегчить себе задачу, можно сначала сохранить параметры пользователя в файле, а потом использовать этот файл при пересоздании:

   $ ../bin/python manage.py dumpdata --indent=2 auth > initial_data.json
   $ rm myproject/database/database.sqlite3 
   $ ../bin/python manage.py syncdb --noinput

Имя initial_data.json является специальным, данные из этого файла автоматически считываются при инициализации СУБД.

Другие решения:

[править] Как увидеть backtrace для ajax-вызовов?

Вариантов несколько. Самый простой — использовать следующий декоратор, для функции, которая возвращает результат для ajax-вызова:

import sys
import traceback

def console_debug(f):
  def x(*args, **kw):
    try:
      ret = f(*args, **kw)
    except Exception, e:
      print >> sys.stderr, "ERROR:", str(e)
      exc_type, exc_value, tb = sys.exc_info()
      message = "Type: %s\nValue: %s\nTraceback:\n\n%s" % (exc_type, exc_value, "\n".join(traceback.format_tb(tb)))
      print >> sys.stderr, message
      raise
    else:
      return ret
  return x

@console_debug
def my_ajax_function(request):
   0/0

Источник: [1].


[править] Как сделать функцию для редактирования и создания объекта одним махом?

@login_required
def edit(request, id=None, template_name='article_edit_template.html'):
    if id:
        article = get_object_or_404(Article, pk=id)
        if article.author != request.user:
            return HttpResponseForbidden()
    else:
        article = Article(author=request.user)

    if request.POST:
        form = ArticleForm(request.POST, instance=article)
        if form.is_valid():
            form.save()

            # If the save was successful, redirect to another page
            redirect_url = reverse(article_save_success)
            return HttpResponseRedirect(redirect_url)

    else:
        form = ArticleForm(instance=article)

    return render_to_response(template_name, {
        'form': form,
    }, context_instance=RequestContext(request))

И в urls.py при этом:

(r'^article/new/$', views.edit, {}, 'article_new'),
(r'^article/edit/(?P<id>\d+)/$', views.edit, {}, 'article_edit'),

Источник:

[править] Дополнительная информация

[править] RESTful-взаимодействие в Django

[править] Битва Django и Ruby on Rails

Источник — «http://xgu.ru/wiki/Django»