Улюблені поради та функції Django?


308

Натхненний серією питань "Приховані особливості ...", мені цікаво почути про ваші улюблені поради Джанго або менш відомі, але корисні функції, про які ви знаєте.

  • Будь ласка, включіть лише одну пораду на відповідь.
  • Додайте вимоги до версії Django, якщо такі є.

Відповіді:


221

Я просто почну з підказки від себе :)

Використовуйте os.path.dirname () у налаштуваннях.py, щоб уникнути жорстких кодів dirname.

Не встановлюйте жорсткий код у вашому settings.py, якщо ви хочете запускати проект у різних місцях. Використовуйте наступний код у settings.py, якщо ваші шаблони та статичні файли знаходяться в каталозі проектів Django:

# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, "templates"),
)

Кредити: Цю пораду я отримав із екранізації " Django From the Ground Up ".


75
Ви не повинні звертати увагу на людей, які відповідають на власні запитання. Це заохочується, навіть якщо це заздалегідь визначено.
Паоло Бергантіно,

19
Це така гарна ідея, що мені ще важко зрозуміти, чому це не за замовчуванням. Скільки людей тестують та розгортають на одній машині?
SingleNegationElimination

19
Це позбавляє вас від завжди типу os.path.join () , який отримує дратує досить швидко: j = lambda filename: os.path.join(PROJECT_DIR, filename). Тоді вам просто потрібно набрати j("static").
написано.

13
Якщо ви на Windows , а потім замінити зворотний слеш: os.path.join (project_dir, "шаблони") замінити ( '\\', '/').
Пітер Мортенсен

7
Якщо вам дуже подобається це виправити в Django, залиште коментар на code.djangoproject.com/ticket/694, щоб просити основних розробників переглянути wontfixрішення.
sorin

128

Встановіть Django Command Extensions та pygraphviz, а потім видайте таку команду, щоб отримати дійсно красиву візуалізацію моделі Django:

./manage.py graph_models -a -g -o my_project.png

Приємно, не вдалося змусити pygraphviz правильно встановитись у Windows, але все ж може приховати з крапки файл за допомогою graphviz.
monkut

Я люблю ділитися діаграмами моделей із цим, безумовно, +1
BozoJoe,

Чи є для цього варіант svg?
Кейо

Здається, вихідне зображення зараз
розбито

119

Використовуйте декоратор джанго-дратівливого, render_to а не render_to_response.

@render_to('template.html')
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return {'bars': bars}

# equals to
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return render_to_response('template.html',
                              {'bars': bars},
                              context_instance=RequestContext(request))

Відредагований, щоб вказати, що повернення HttpResponse (наприклад, переадресація) призведе до короткого замикання декоратора і працювати так, як ви очікуєте.


4
@becomingGuru - це відбувається автоматично.
Домінік Роджер

15
Це добре, якщо ви не повертаєте деякі HttpResponseRedirect () s та деякі render_to_response () s. Тоді перенаправлення не вдається.
Matthew Schinckel

17
Мені це не подобається. "Явне краще, ніж неявне". Декоратор не каже, коли саме він збирається render_to.
Tamás Szelei

2
@Matthew Schinckel він насправді не псує переадресації - якщо ви повернете об’єкт HttpResponse, він просто передає його, не змінюючи його
Jiaaro

20
Я вважаю , що цей підхід тепер надлишково від Django 1.3 см django.shortcuts.render () docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
Дольф

101

Існує набір спеціальних тегів, які я використовую у всіх шаблонах свого сайту. Шукаючи способу його автоматичного завантаження (сушився, пам’ятаєте?), Я знайшов таке:

from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')

Якщо ви помістите це в модуль, завантажений за замовчуванням (наприклад, ваш головний urlconf), ви матимете теги та фільтри вашого власного модуля тегів у будь-якому шаблоні без використання {% load custom_tag_module %}.

Переданим аргументом template.add_to_builtins()може бути будь-який шлях модуля; у вашому користувальницькому модулі тегів не повинно жити конкретна програма. Наприклад, він також може бути модулем у кореневому каталозі вашого проекту (наприклад, 'project.custom_tag_module').


@Steef, ти щойно врятував мені багато часу / душі / байтів, дякую.
orokusaki

Дійсно приємно. Дякую. Також сховище спеціальних тегів було б чудово для того, щоб поділитися речами, ви не думаєте?
Леандро Ардіссоне

Це чудово, поки комусь не доведеться підтримувати ваш код. Подумайте: «принцип найменшої магії»
Багатий

96

Virtualenv + Python = збереження життя, якщо ви працюєте над декількома проектами Django і є ймовірність, що всі вони не залежать від однієї і тієї ж версії Django / програми.


15
Це ТІЛЬКИ спосіб прокатки!
постфутурист

3
Не могли б ви додати кілька посилань підручника для virtualenv з django?
BozoJoe

2
@BozoJoe: Зробіть це в вашому терміналі: virtualenv myNewEnv --no-site-packages; . myNewEnv/bin/activate; pip install django; І це просто працює!
SingleNegationElimination

87

Не жорстко кодуйте свої URL-адреси!

Натомість використовуйте назви URL та reverseфункцію отримання самої URL-адреси.

Коли ви визначаєте відображення URL-адрес, вкажіть назви своїм URL-адресам.

urlpatterns += ('project.application.views'
   url( r'^something/$', 'view_function', name="url-name" ),
   ....
)

Переконайтесь, що ім’я унікальне за URL-адресою.

Зазвичай у мене є послідовний формат "проект-додаток-перегляд", наприклад, "cbx-forum-thread" для подання потоку.

ОНОВЛЕННЯ (безсоромно вкравши додаток Айяза ):

Це ім'я можна використовувати в шаблонах з urlтегом .


1
Я погоджуюсь 100% на це. Я почав використовувати жорсткі кодовані URL-адреси, і це мене покусало над проектом, коли я трохи змінив формат URL-адреси, щоб прийняти деякі зміни. Я взяв час, щоб повернутися назад і переглянути все і замінити жорсткі кодовані URL-адреси. Моя єдина велика скарга - це те, що помилки тегу URL-адреси вбивають всю сторінку, а жорсткі коди лише псують окреме посилання.
ricree

21
Це не повинно бути прихованою особливістю, це найкраща практика і єдиний спосіб літати.
Skylar Saveland

1
@skyl Це навряд чи "єдиний спосіб літати". Я був у спринті розробки Django, і Адріан Головати (один із творців Django) сказав, що він навіть не використовує urlтег ... Його позиція полягає в тому, що URL-адреси не повинні змінюватися в будь-якому випадку (якщо ви хочете бути дружніми до своїх користувачів).
ТМ.

Ви також можете використовувати це в шаблонах, як у {% url path.to.view.name arg1 arg2 %} docs.djangoproject.com/en/dev/ref/templates/builtins/…
SingleNegationElimination

Якщо ви використовуєте jinja2, просто додайте reverseтак, environment.filters['url'] = django.core.urlresolvers.reverseі ви можете використовувати його у своїх шаблонах так: {{ 'view-name'|url(arg1, arg2)|e }}("e" потрібно, щоб уникнути деяких символів для включення в HTML)
SingleNegationElimination


79

Не пишіть власні сторінки для входу. Якщо ви використовуєте django.contrib.auth.

Справжній брудний секрет полягає в тому, що якщо ви також використовуєте django.contrib.admin і django.template.loaders.app_directories.load_template_source у ваших завантажувачах шаблонів, ви також можете безкоштовно отримати свої шаблони!

# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
    (r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
    (r'^accounts/logout/$','views.logout'),
)

1
Класно! Я не знав, що ми можемо повторно використовувати сторінку входу адміністраторів. Дякую!
Джошуа Партогі

66

Контекстні процесори є приголомшливими.

Скажіть, у вас інша модель користувача, і ви хочете включити це у кожну відповідь. Замість цього:

def myview(request, arg, arg2=None, template='my/template.html'):
    ''' My view... '''
    response = dict()
    myuser = MyUser.objects.get(user=request.user)
    response['my_user'] = myuser
    ...
    return render_to_response(template,
                              response,
                              context_instance=RequestContext(request))

Контекстні процеси дають вам можливість передавати будь-яку змінну вашим шаблонам. Я, як правило, кладу свою 'my_project/apps/core/context.py:

def my_context(request):
    try:
        return dict(my_user=MyUser.objects.get(user=request.user))
    except ObjectNotFound:
        return dict(my_user='')

У вашому settings.pyдодати рядок відповідно з ВашимTEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    'my_project.apps.core.context.my_context',
    ...
)

Тепер при кожному запиті він my_userавтоматично включає ключ.

Також сигнали виграють.

Я писав про це в блозі кілька місяців тому, тому я просто збираюся вирізати та вставляти:

З-під коробки Джанго подає кілька сигналів, які неймовірно корисні. Ви маєте можливість робити речі до і після збереження, ініціації, видалення або навіть під час обробки запиту. Тож давайте відійдемо від понять і продемонструємо, як вони використовуються. Скажіть, у нас є блог

from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
    title = models.CharField(_('title'), max_length=255)
    body = models.TextField(_('body'))
    created = models.DateTimeField(auto_now_add=True)

Тож хочете якось сповістити одну з багатьох служб пінг-блогу, про яку ми створили нову публікацію, відновіть кеш найсвіжіших публікацій та твіт. Добре із сигналами у вас є можливість робити все це без необхідності додавати будь-які методи до класу Post.

import twitter

from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings

def posted_blog(sender, created=None, instance=None, **kwargs):
    ''' Listens for a blog post to save and alerts some services. '''
    if (created and instance is not None):
        tweet = 'New blog post! %s' instance.title
        t = twitter.PostUpdate(settings.TWITTER_USER,
                               settings.TWITTER_PASSWD,
                               tweet)
        cache.set(instance.cache_key, instance, 60*5)
       # send pingbacks
       # ...
       # whatever else
    else:
        cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=Post)

Там ми йдемо, визначаючи цю функцію та використовуючи сигнал post_init, щоб підключити функцію до моделі "Пост" та виконати її після її збереження.


4
Сигнали Джанго є для мене обов'язковою функцією сьогодні, коли порівнюємо веб-рамки. Написати слабко пов'язаний форум, скажімо, що можна слухати, скажімо, оновлення модуля "підпис", але насправді цей модуль не потребує роботи, а також може працювати з сумісними модулями, що реалізують ту саму функцію, чудово. Я не знаю, чому сигнали не є більш відомими та популярними.
Лі Б

Сигнали дуже важливі, щоб уникнути щільного зв’язку та безладу коду взагалі, якщо ми використовуємо кілька програм для багаторазового використання у нашому проекті. Ви навели чудовий приклад для нещільного з'єднання програм django, +1 для цього.
Лукаш Коржибський

Чи знаєте ви, чи сигнали асинхронні?
Кедаре

"Скажіть, у вас інша модель користувача, і ви хочете включити це у кожну відповідь." - Покладіть користувача на сеанс . Це дозволяє економити звернення до бази даних для кожного запиту.
варення

Виклики сигналів синхронні. На мою думку, якийсь асинхронний механізм роботи більше підходить для, скажімо, публікації у Twitter / Facebook / тощо (тобто - rabbitmq), тому користувачі веб-сайту не висять за запитом.
gorsky

58

Коли я починав, я не знав, що існує Пагінатор , переконайтесь, що ви знаєте про його існування !!


2
: D те ж саме для мене! Я витрачав дні на сторінки на сторінки!
vikingosegundo

46

Використовуйте IPython, щоб перейти до вашого коду на будь-якому рівні та налагодити, використовуючи потужність IPython. Після встановлення IPython просто покладіть цей код туди, де ви хочете налагоджувати:

from IPython.Shell import IPShellEmbed; IPShellEmbed()()

Потім оновіть сторінку, перейдіть до свого вікна runserver, і ви опинитеся в інтерактивному вікні IPython.

У мене встановлений фрагмент у TextMate, тому я просто набираю ipshell і клацніть на вкладці. Я не міг жити без цього.


22
Краще встановіть, ipdbа потім просто наберітьipdb.set_trace()
Tomasz Zieliński,

Або скористайтеся налагоджувачем Eclipse / PyDev. :-)
jMyles

3
імпортувати ipdb; ipdb.set_trace () FTW!
Хассек

43

Запустіть сервер розробки SMTP, який буде просто виводити все, що йому надіслано (якщо ви не хочете фактично встановлювати SMTP на свій сервер розробників.)

командний рядок:

python -m smtpd -n -c DebuggingServer localhost:1025

12
ви можете використовувати консольні та файлові мітки електронної пошти у django 1.2 з тією ж метою
Дмитро Шевченко

видатний! ідеально підходить для реєстрації! +1
BozoJoe

3
Альтернатива в Django 1.2 з налаштуваннями: .. що EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' надрукує електронну пошту на manage.pyвихід.
vdboor

41

З документації django-admin :

Якщо ви використовуєте оболонку Bash, подумайте про встановлення сценарію завершення баш Django, який знаходиться extras/django_bash_completionв дистрибутиві Django. Це дозволяє завершити вкладку django-admin.pyта manage.pyкоманди, так що ви можете, наприклад, ...

  • Тип django-admin.py .
  • Натисніть [TAB], щоб переглянути всі доступні опції.
  • Введіть sql, а потім [TAB], щоб побачити всі доступні параметри, імена яких починаються з sql.

1
Це корисніше, ніж я очікував. Дякую!
Jeeyoung Kim

Це за замовчуванням у новіших Ubuntu принаймні. :-) Я був вражений, коли вперше з'явився з нізвідки.
odinho - Велмонт,

40

./manage.py runserver_plusFacilty , який поставляється з django_extensions воістину дивним.

Він створює розширену сторінку налагодження, яка, крім іншого, використовує налагоджувач Werkzeug для створення інтерактивних консолей налагодження для кожної точки стека (див. Скріншот). Він також надає дуже корисний метод налагодження зручності dump()для відображення інформації про об'єкт / кадр.

введіть тут опис зображення

Щоб встановити, ви можете використовувати pip:

pip install django_extensions
pip install Werkzeug

Потім додайте 'django_extensions'до свого INSTALLED_APPSкортежу settings.pyта запустіть сервер розробки з новим розширенням:

./manage.py runserver_plus

Це змінить спосіб налагодження.


37

Мені подобається використовувати налагоджувач pdb Python для налагодження проектів Django.

Це корисне посилання для того, як навчитися ним користуватися: http://www.ferg.org/papers/debugging_in_python.html


13
Це знахідка. Щоб дати трохи більше інформації, просто додайте це: "import pdb; pdb.set_trace ()" у будь-якому рядку вашого коду. Оновіть свою сторінку. Він буде висіти. Тепер перейдіть до свого термінального вікна, де ви запускаєте сервер розвитку. Тепер це повинна бути інтерактивна оболонка, де ви можете отримати доступ до всіх змінних, як вони є в той момент вашого коду, куди ви вставили код налагодження.
священик

37

Намагаючись обмінюватися даними між Django та іншим додатком, request.raw_post_dataє хорошим другом. Використовуйте його для отримання та користувацької обробки, скажімо, XML-даних.

Документація: http://docs.djangoproject.com/en/dev/ref/request-response/


5
ТИ як ти це робиш.
Дякую

36

Використовуйте Jinja2 разом з Django.

Якщо ви вважаєте, що мова шаблону Django є надзвичайно обмежуючою (як я!), То вам не доведеться зациклюватися на ній. Django є гнучким, а мова шаблону слабко пов'язана з рештою системи, тому просто підключіть іншу мову шаблону і використовуйте його, щоб надати ваші http відповіді!

Я використовую Jinja2 , це майже як ввімкнена версія мови шаблону django, він використовує той самий синтаксис і дозволяє використовувати вирази, якщо заяви! більше не створювати спеціальні if-теги, такі як if_item_in_list! ви можете просто сказати %{ if item in list %}, або{% if object.field < 10 %} .

Але це ще не все; У нього є багато інших функцій для полегшення створення шаблонів, тому я не можу перейти, хоча всі вони тут.


Я також користуюся Jinja2 і насолоджуюся ним, але я виявив, що для додатків "contrib" є декілька муфт. Зокрема, інструмент адміністрування досить сильно прив’язаний до шаблонів Django. Крім того, мені довелося відтворити декораторів входу в contrib.auth, щоб бути дружнім Jinja2, але не надто важко.
Джо Холлоуей

24
Не замінюйте систему шаблонів jinja2, просто "додайте" її, не видаляйте шаблони django. Використовуйте Jinja2 для власного перегляду, і дозвольте інтерфейсу адміністратора продовжувати використовувати мову шаблонів django.
hasen

4
Я з цим погоджуюсь. Обмежений синтаксис Джанго є терпимим більшу частину часу, але коли ви доходите до створення власних тегів і дізнаєтеся, наскільки важко це насправді, Jinja2 - це подих свіжого повітря
SingleNegationElimination

Крім того, якщо ви хочете виконати будь-яку метапрограмування на джерелі шаблону, Jinja2 набагато приємніше, оскільки ви можете безпосередньо отримати доступ до AST проаналізованих шаблонів. Ходьба по AST робить завдання, як-от дізнатися, які шаблони поширюють базовий шаблон, або перераховувати незв’язані змінні у блоці джерела шаблону майже тривіально просто.
rcoder

5
На щастя, у Django 1.2 тег IF набагато розумніший
Nixarn

35

Додайте assert Falseу код перегляду, щоб скинути інформацію про налагодження.


4
Я думаю, що твердити False є більш інтуїтивно зрозумілим = D
Jiaaro

13
якщо ви запускаєте проект на сервері розробки django, використовуйте модуль pdb python. Це набагато більш потужний спосіб налагодження: імпортувати pdb; pdb.stack_trace ()
mazelife

pdb є дуже корисним, ви, ймовірно, матимете час на з'єднання, якщо ви не дуже швидкі при налагодженні.
Стівен Полгер

4
Я завжди використовую 5 / 0себе. Чому п’ять? Не маю уявлення.
JasonSmith

@StephenPaulger насправді? Мій браузер (firefox / w firebug) здається, що вміст чекає декількох хвилин на відповідь, поки я налагоджую.
ТМ.

34

Це додає до відповіді вище про імена URL-адрес Джанго та зворотну розсилку URL-адрес .

Імена URL-адрес також можна ефективно використовувати в шаблонах. Наприклад, для заданого шаблону URL:

url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')

у шаблонах ви можете мати таке:

<a href="{% url project_team project.id %}">Team</a>

27

Оскільки "перегляди" Джанго мають бути лише дзвінками, які повертають HttpResponse, ви можете легко створювати представлення на основі класу, такі, як у Ruby on Rails та інших рамах.

Існує кілька способів створення переглядів на основі класу, ось мій улюблений:

from django import http

class RestView(object):
    methods = ('GET', 'HEAD')

    @classmethod
    def dispatch(cls, request, *args, **kwargs):
        resource = cls()
        if request.method.lower() not in (method.lower() for method in resource.methods):
            return http.HttpResponseNotAllowed(resource.methods)
        try:
            method = getattr(resource, request.method.lower())
        except AttributeError:
            raise Exception("View method `%s` does not exist." % request.method.lower())
        if not callable(method):
            raise Exception("View method `%s` is not callable." % request.method.lower())
        return method(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        return http.HttpResponse()

    def head(self, request, *args, **kwargs):
        response = self.get(request, *args, **kwargs)
        response.content = ''
        return response

Ви можете додати всі види інших речей, наприклад, умовно обробку запиту та авторизацію у базовому поданні.

Після налаштування перегляду ваш urls.py буде виглядати приблизно так:

from django.conf.urls.defaults import *
from views import MyRestView

urlpatterns = patterns('',
    (r'^restview/', MyRestView.dispatch),
)

2
FWIW, автори джанго насправді використовують класи на основі класів у кількох місцях, наприклад contrib.formtools: code.djangoproject.com/browser/django/trunk/django/contrib/…
mazelife

3
Якщо ви додасте метод виклику, ви можете створити клас під назвою RestfulResource, а потім вказати urls.py на інстанції.
Стівен Полгер

1
Нові (Django 1.3?) Загальні погляди ґрунтуються на класах.
gorsky

21

Замість того, render_to_responseщоб прив’язати ваш контекст до шаблону та візуалізувати його (що зазвичай показують документи Django), використовуйте загальний вигляд direct_to_template. Це робить те саме, що render_to_responseробить, але також автоматично додає RequestContext до контексту шаблону, неявно дозволяючи використовувати процесори контексту. Це можна зробити вручну, використовуючи render_to_response, але навіщо турбуватися? Це просто ще один крок, щоб запам'ятати і ще один LOC. Крім використання процесорів контексту, наявність RequestContext у вашому шаблоні дозволяє виконувати такі дії:

<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a> 

що дуже корисно. Насправді +1 в цілому на загальні погляди. Документи Django в основному показують їх як ярлики для того, щоб навіть не було файлу view.py для простих додатків, але ви також можете використовувати їх у власних функціях перегляду:

from django.views.generic import simple

def article_detail(request, slug=None):
    article = get_object_or_404(Article, slug=slug)
    return simple.direct_to_template(request, 
        template="articles/article_detail.html",
        extra_context={'article': article}
    )

Збережіть ще більше LOC, використовуючи декоратор @render_to, доступний у django-дратує. bitbucket.org/offline/django-annoying
безсумнівний

6
.. або використовувати новий renderметод ярлика від Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
gorsky

20

У мене недостатньо репутації, щоб відповісти на коментар, про який йдеться, але важливо зазначити, що якщо ви збираєтеся використовувати Jinja , він не підтримує символ "-" у назвах блоків шаблонів, у той час як Django це робить. Це спричинило мені чимало проблем і витрачало час, намагаючись відстежувати дуже незрозуміле повідомлення про помилку, яке воно створювало.


Одна примітка, яка може бути або не застосовуватися до "незрозумілих повідомлень про помилки від jinja". Обов’язково встановіть TEMPLATE_DEBUG = Неправда в налаштуваннях.py. Чомусь це призведе до вагомих помилок у шаблонах Jinja.
Карл Г

19

Додаток для веб-дизайну дуже корисний для початку дизайну вашого веб-сайту. Після імпортування ви можете додати це для створення зразкового тексту:

{% load webdesign %}
{% lorem 5 p %}

4
FYI, для тих, хто використовує Jinja2 замість шаблонів Django, ви можете зробити: {{lipum (5)}}
Джо Холлоуей

19

django.db.models.get_model дає змогу отримати модель, не імпортуючи її.

Джеймс показує, наскільки це може бути зручно: "Поради щодо Джанго: Напишіть кращі теги шаблонів - Ітерація 4" .


Приємно: О! І тут я робив ледачий імпорт, коли мав кругові залежності.
Філіп Дупанович

19

Всім відомо, що існує сервер розробки, на якому можна запустити "management.py runserver", але чи знали ви, що існує перегляд розробки для обслуговування статичних файлів (CSS / JS / IMG)?

Новачки завжди спантеличені тим, що Джанго не має жодного способу подачі статичних файлів. Це тому, що команда розробників вважає, що це робота для веб-сервера в реальному житті.

Але розвиваючись, ви, можливо, не захочете налаштовувати Apache + mod_wisgi, це важко. Тоді ви можете просто додати наступне до urls.py:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': '/path/to/media'}),

Ваш CSS / JS / IMG буде доступний на веб-сайті www.yoursite.com/site_media/.

Звичайно, не використовуйте його у виробничих умовах.


6
Я використовую це в режимі розробки, і щоб переконатися, що я не забуду вимкнути це у виробництві, я загортаю це правило URL-адреси в DEBUG лише умовно.
sghael

18

Про це я дізнався з документації на ескізи сорлів . Ви можете використовувати ключові слова "як" у тегах шаблонів, щоб використовувати результати виклику в іншому місці вашого шаблону.

Наприклад:

{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>

Про це згадується, проходячи в документації з тегами шаблонів Django, але лише стосовно циклів. Вони не закликають, що ви також можете використовувати це деінде (де завгодно?).


7
Якщо ключове слово "як" можна використовувати з тегом шаблону, залежить від цього конкретного тегу. Він визначається не самим django, а окремими тегами, залежно від їх значення. Погляньте на згаданий URL-тег, щоб побачити, як використовується "як": code.djangoproject.com/browser/django/trunk/django/template/…
vikingosegundo

16

django.views.generic.list_detail.object_list - Він надає всі змінні логіки та шаблону для розбиття на сторінки (одна з тих, що я написала-що-тисячу разів-зараз друкарі). Обгортання дозволяє використовувати будь-яку логіку, яка вам потрібна. Цей дорогоцінний камінь врятував мені багато годин налагодження помилок по черзі на моїх сторінках "Результати пошуку" та робить код перегляду чистішим у процесі.


1
Ви можете знайти нову версію глави книги про загальні погляди на djangobook.com/en/2.0/chapter11 . Той, хто йде в коментарі, переходить до версії книги "Джанго до 1,0" (книга Джанго 1,0)
Естебан Кюбер

16

PyCharm IDE - це приємне середовище для кодування та, особливо, налагодження, із вбудованою підтримкою Django.


14

Використовуйте xml_models для створення моделей Django, в яких використовується API XML REST API (замість SQL). Це дуже корисно, особливо при моделюванні API сторонніх розробників - ви отримуєте той самий синтаксис QuerySet, до якого ви звикли. Ви можете встановити його з PyPI.

XML від API:

<profile id=4>
    <email>joe@example.com</email>
    <first_name>Joe</first_name>
    <last_name>Example</last_name>
    <date_of_birth>1975-05-15</date_of_birth>
</profile>

А тепер у python:

class Profile(xml_models.Model):
    user_id = xml_models.IntField(xpath='/profile/@id')
    email = xml_models.CharField(xpath='/profile/email')
    first = xml_models.CharField(xpath='/profile/first_name')
    last = xml_models.CharField(xpath='/profile/last_name')
    birthday = xml_models.DateField(xpath='/profile/date_of_birth')

    finders = {
        (user_id,):  settings.API_URL +'/api/v1/profile/userid/%s',
        (email,):  settings.API_URL +'/api/v1/profile/email/%s',
    }

profile = Profile.objects.get(user_id=4)
print profile.email
# would print 'joe@example.com'

Він також може обробляти стосунки та колекції. Ми використовуємо його щодня у широко використовуваному виробничому коді, тому, хоча це бета-версія, вона дуже зручна. Він також має гарний набір заглушок, які ви можете використовувати у своїх тестах.

(Відмова: хоча я не автор цієї бібліотеки, я зараз є членом комітету, зробивши кілька незначних зобов'язань)


цікавий проект, так тримати!
Сергій Головченко

Дякую, це досить зручно :-)
боги одягаються

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.