Заметки Django
Сортировка: поле сортировки жестко задано в моделе
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
def __unicode__(self):
return self.name
class Meta:
ordering = ["name"]
Пока не будет использован явный вызов метода order_by(), все объекты Publisher будут выдаваться отсортированными по полю name. Полный список полей мета гуглим "django available meta options"
Передача в шаблон списка или кортежа
*view.py*
from django.template import RequestContext
dic=['red', 'gree', 'white']
OR
dic=('red', 'gree', 'white')
return render_to_response('kinopoisk.html', \
context_instance=RequestContext(request, {'data':dic}))
*template.html*
{% for value in data %}
{{ value }}
{% endfor %}
Пути для статики
STATIC_URL
- '/static/' Это не ПУТЬ, а УРЛ! Добавляется к имени статического файла. Например,
в темплейте {% static "jquery/dist/jquery.min.js" %}
станет запросом <site>/static/jquery/dist/jquery.min.js
MEDIA_ROOT
- место, где хранятся залитые пользователем файлы для полей FileField.
Absolute filesystem path to the directory that will hold user-uploaded files.
STATIC_ROOT
- абсолютный путь к директории, куда метод manage.py collectstatic
соберет всю статику.
Обычно этот путь имеет смысл на деплойменте. Collectstatic собирает, в т.ч., скрипты и стили от используемых приложений,
например, grappelli или admin. Ручками сюда ничего ложить нельзя!
Еще один момент - STATIC_ROOT
не может пересекаться с STATICFILES_DIRS
, иначе это вызовет ексепшн ImproperlyConfigured
.
Ну это и логически понятно, collectstatic не может собирать файлы из одной директории в ту же самую.
The absolute path to the directory where collectstatic will collect static files for deployment.
If the staticfiles contrib app is enabled (default) the collectstatic management command will collect static files into this directory. See the howto on managing static files for more details about usage.
STATICFILES_DIRS
- это список(list) директорий, в которых Джанго будет искать статику, в дополнение к каждой директории static
каждого app.
This setting defines the additional locations the staticfiles app will traverse if the FileSystemFinder finder is enabled, e.g. if you use the collectstatic or findstatic management command or use the static file serving view.
Выполнить скрипт в командной строке в окружении Django
#!/usr/bin/env python
import sys, os
from pprint import pprint
sys.path.append('/home/swasher/pdfupload')
os.environ['DJANGO_SETTINGS_MODULE'] = 'pdfupload.settings'
from django.conf import settings
pprint(settings.DATABASES)
Как сделать редирект на текущий домен, но на другой порт
Например, я хочу перейти на порт 9181, на котором работает rq-dashbord. Можно прибить в темплейте ссылку гвоздями, но тогда не будет нормально работать на продакшене/тестинге/девелопменте. Сделать ссылку на текущий домен можно следующим образом.
Во первых, нужно знать, что в Django 1.8 изменили формат настройки темплейтов
в settings.py
: убрали все настройки, связанные с темплейтами (в частности, TEMPLATE_CONTEXT_PROCESSORS), и
ввели только одну, для всего - TEMPLATES.
По умолчанию там не содержится 'django.template.context_processors.request', поэтому надо добавить в наш
settings.py
шаблон настройки TEMPLATES (по ссылке выше), и в раздел 'context_processors'
добавить обработчик request.
Теперь у нас в каждом шаблоне будет доступна переменная request. Ссылку теперь можно сформировать так:
<a href="{{ request.get_host }}:9181">
Установка Pillow
Tip on Decoder JPEG not available (addition to docs ?)
Set Django's FileField to an existing file
Set Django's FileField to an existing file
Прикол с MEDIA_URL и STATIC_URL
Если url начинается со слеша (MEDIA_URL = "/media/"), то при обращении к полю базы в темплейте, например
{{ gallery.image.url }}
, суффикс будет добавлен к домену:
www.mygallery.com/media
Если же слеша нет, то суффикс будет добавлен к текущему адресу:
www.mygallery.com/photo/media
Организация структуры каталогов
Называйте ваш проект project (django-admin.py startproject project) — ну или другим, но одинаковым именем для всех проектов. Раньше я называл проекты соответственно домену, но при повторном использовании приложений в других проектах приходилось менять пути импорта — то from supersite import utils, то from newsite import utils. Это путает и отвлекает. Если расширить этот совет — зафиксируйте (унифицируйте) для себя структуру каталогов всех ваших проектов и строго её придерживайтесь.
Живой пример:
--site.ua
|--static
|--media
|--project (папка с проектом)
|--manage.py
|--project (папка с основным приложением)
| |--settings.py
| |--urls.py
| |-- ...
|--app1
|--app2
|--...
Добавить кнопку в админку, на страницу-список объектов
class ComponentAdmin(admin.ModelAdmin):
def button(self, obj):
return mark_safe('<input type="submit" value="Load properties" class="default" name="load_properties" />')
button.short_description = 'Action'
button.allow_tags = True
list_display=['name', 'button']
How to limit the queryset of an inline model in django admin
Use the get_queryset method:
class BAdmin(admin.TabularInline):
...
def get_queryset(self, request):
qs = super(BAdmin, self).get_queryset(request)
return qs.filter(user=request.user)
Как откатить назад последнюю миграцию?
- Identify the migrations you want by ./manage.py showmigrations
- Migrate to desired migration
For example, if your last two migrations are:
0010_previous_migration
0011_migration_to_revert
Then you would do:
./manage.py migrate my_app 0010_previous_migration
Then delete file 0011_migration_to_revert
Большинство миграций можно удачно вернуть назад. Однако, существуют такие действия с базами, которые нельзя "сделать наоборот", например, кастомные скрипты.
Tooltip in help text
Found (here)[http://stackoverflow.com/a/35273389/1334825]
my_strange_field = models.FloatField('strange parameter', validators=[MinValueValidator(1.0)],
help_text='corr. factor x >= 1 <img src="/static/admin/img/icon-unknown.svg" '
'width="15" height="15" title="typical values:\n'
'cow:\t2..3\ncat:\t5..7\ndog:\t11..15')
Изменение help_text "на лету"
class ComponentAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(ComponentAdmin, self).get_form(request, obj, **kwargs)
buy_date = obj.purchase_date
month_of_warranty = obj.warranty
end_of_warranty = add_months(buy_date, month_of_warranty)
form.base_fields['warranty'].help_text = "End of warranty: {:%d %B %Y}".format(end_of_warranty)
return form
Comments !