Django FAQ

Матеріал з Wiki Welard
Перейти до навігації Перейти до пошуку

Основні команди та нюанси при роботі з системою 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()"