Django FAQ
Основні команди та нюанси при роботі з системою Django
django-admin.py startproject mysite python manage.py startapp books python manage.py validate python manage.py sqlall books python manage.py syncdb python manage.py inspectdb
Модуль для роботи із зобраденнями на python http://www.pythonware.com/products/pil/
Створення бази даних
create database exam2 charset=utf8; ALTER DATABASE exam2 DEFAULT CHARACTER SET 'utf8'
Замінити в базі до полів типу varchar
"character set utf8 collate utf8_unicode_ci"
Куски коду
1. {% cycle 'row1' 'row2' %}
2. Перегрупування в шаблоні
{% regroup people by gender as gender_list %}
{% regroup people|dictsort:"gender" by gender as gender_list %}
<ul>
{% for gender in gender_list %}
<li>{{ gender.grouper }}
<ul>
{% for item in gender.list %}
<li>{{ item.first_name }} {{ item.last_name }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
3. Шаблон форми
<form method="post" action="">
<dl>
{% for field in form %}
<dt>{{ field.label_tag }}{% if field.field.required %}*{% endif %}</dt>
<dd>{{ field }}</dd>
{% if field.help_text %}<dd>{{ field.help_text }}</dd>{% endif %}
{% if field.errors %}<dd class="myerrors">{{ field.errors }}</dd>{% endif %}
{% endfor %}
</dl>
<input type="submit" />
</form>
4. Робота з формою в views.py
instance = Instance(required_field='value') form = InstanceForm(request.POST, instance=instance) new_instance = form.save()
instance = form.save(commit=False) instance.required_field = 'new value' new_instance = instance.save()
5. allNodes = Form.serialize("myform");
6. Профілі користувачів
in settings.py:
AUTH_PROFILE_MODULE = 'projectname.UserProfile'
в інших відповідних файлах
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='%(class)s', primary_key=True)
from django.contrib.auth.models import User u = User.objects.get(username='test') user_profile = u.profile.get()
7. Pagination - розбиття на сторінки
from django.core.paginator import Paginator objects = ['john', 'paul', 'george', 'ringo'] p = Paginator(objects, 2) page1 = p.page(1) page1.object_list
8. Багатомовність
django-admin.py makemessages -l uk django-admin.py compilemessages
9. Групиування в SQL
qs = Schedule.objects.select_related().filter(pub_date__gte=datetime.now())
qs.query.group_by = ['country_id'] #!!!!!!
return {'schedule': qs}
>>> qs = TumbleItem.objects.all() >>> qs.query.group_by = ['item_type'] >>> qs.query.having = ['COUNT(item_type) > 1'] >>> item_types = [i.item_type for i in qs] >>> item_types
10. Кешування процедури
@cached( trigger = { "signal" : ( signals.post_save, signals.post_delete ),"sender" : Post } )
def get_latest_posts():
return list( Post.objects.all().order_by( "-date" )[:5] )
11. Дописування методів в адмінку
def remove(self):
from django.core.urlresolvers import reverse
return '<a href="%s" class="deletelink">Delete</a>' % reverse( "django.contrib.admin.views.main.delete_stage",
args = ( self.__class__._meta.app_label, self.__class__.__name__.lower(), self._get_pk_val(), ) )
remove.allow_tags = True
12. Приклад WSGI
sys.stdout = sys.stderr
import os, sys
sys.path.append('/usr/lib/python2.4/site-packages/django')
sys.path.append('/var/www/paradise/paradise')
sys.path.append('/var/www/paradise')
os.environ['DJANGO_SETTINGS_MODULE'] = 'paradise.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
13. Профілі користувачів
from django.contrib import admin
from profile.models import UserProfile
from django.contrib.auth.models import User
class ProfileInline(admin.StackedInline):
model = UserProfile
extra = 1
max_num = 1
class ProfileAdmin(admin.ModelAdmin):
inlines = (ProfileInline,)
admin.site.unregister(User) #!!!
admin.site.register(User, ProfileAdmin)
14. Профілі 2
from django.contrib.auth.models import User
User.add_to_class('department',models.CharField(max_length=250,blank=True))
User.add_to_class('position',models.CharField(max_length=250,blank=True))
User._meta.admin.fields += (('Custom', {'fields': ('department','position',)}),)
User._meta.admin.list_display += ('department','position',)
def get_user_name(self):
if self.first_name or self.last_name:
return self.first_name + " " + self.last_name
return self.username
User.add_to_class("get_user_name",get_user_name)
15. Якщо є яйця в пітоні
/etc/sysconfig/httpd export PYTHON_EGG_CACHE="/var/cache/python-eggs"
16. Кеш в Django добавити в апач конфігурацію
<IfModule mod_expires.c>
<FilesMatch "\.(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 3 days"
</FilesMatch>
</IfModule>
у файлі views.py:
from django.views.decorators.cache import cache_page
....
@cache_page(60 * 15)
def show_page(request, url=None, page_num=0):
....
....
у файлі admin.py:
from django.core.cache import cache
from django.conf import settings
....
def save_model(self, request, obj, form, change):
#cache.delete('views.decorators.cache.cache_header.%s./%s/' % (settings.CACHE_MIDDLEWARE_KEY_PREFIX, obj.url))
cache._cache.flush_all() # ось так для memcache!!!
obj.save()
17. Корзина
def delete(self, trash=True):
if not self.trashed_at and trash:
self.trashed_at = datetime.now()
self.save()
else:
super(SomeModel, self).delete()
18. Використання unordered_list
['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']], then {{ var|unordered_list }} would return:
<li>States
<ul>
<li>Kansas
<ul>
<li>Lawrence</li>
<li>Topeka</li>
</ul>
</li>
<li>Illinois</li>
</ul>
</li>
18. Використання календаря
class EventSplitDateTime(forms.SplitDateTimeWidget):
def __init__(self, attrs=None):
widgets = [forms.TextInput(attrs={'class': 'vDateField'}),
forms.TextInput(attrs={'class': 'vTimeField'})]
# Note that we're calling MultiWidget, not SplitDateTimeWidget, because
# we want to define widgets.
forms.MultiWidget.__init__(self, widgets, attrs)
def format_output(self, rendered_widgets):
return mark_safe(u'%s<br />%s' % (rendered_widgets[0], rendered_widgets[1]))
class EventForm(forms.Form):
start = forms.DateTimeField(label=ugettext("Start"), widget=EventSplitDateTime())
end = forms.DateTimeField(label=ugettext("End"), widget=EventSplitDateTime())
19. Рестарт WSGI без апача
@never_cache
def restart(request):
''' Перезапуск демона '''
if request.META['mod_wsgi.process_group'] != '':
import signal, os
os.kill(os.getpid(), signal.SIGINT)
ret = 'restarted'
else:
ret = 'not find porcess_group'
return HttpResponse(ret, mimetype='text/plain')
20. Фільтрація в моделі в зовнішньому ключі
models.ForeignKey(Test, limit_choices_to = {'pub_date__lte': datetime.now})
21. Django & Cron
# -*- coding: utf-8 -*-
import sys
import settings
from django.core.management import setup_environ
setup_environ(settings)
module_name = sys.argv[1]
exec('import %s' % module_name)
exec('%s.%s' % (module_name, ' '.join(sys.argv[2:])))
И теперь при помощи этого скрипта мы можем вызывать функции наших “вьюшек” из командной строки и из cron:
# python /path/to/project/run.py report.views "send_emails()"