Відмінності між версіями «Django FAQ»

Матеріал з Wiki Welard
Перейти до навігації Перейти до пошуку
Рядок 6: Рядок 6:
 
  python manage.py syncdb
 
  python manage.py syncdb
 
  python manage.py inspectdb
 
  python manage.py inspectdb
−
 
−
 
 
== Модуль для роботи із зображеннями ==
 
== Модуль для роботи із зображеннями ==
−
 
 
  http://www.pythonware.com/products/pil/  
 
  http://www.pythonware.com/products/pil/  
−
 
−
 
 
== Створення бази даних ==
 
== Створення бази даних ==
 
  create database exam2 charset=utf8;
 
  create database exam2 charset=utf8;
 
  ALTER DATABASE exam2 DEFAULT CHARACTER SET 'utf8'
 
  ALTER DATABASE exam2 DEFAULT CHARACTER SET 'utf8'
−
 
+
== Циклічний перебір ==
−
 
 
−
 
 
−
== 1. Циклічний перебір ==
 
 
  {% cycle 'row1' 'row2' %}  
 
  {% cycle 'row1' 'row2' %}  
−
 
+
== Перегрупування в шаблоні ==
−
== 2. Перегрупування в шаблоні ==
 
−
 
 
<pre>    {% regroup people by gender as gender_list&nbsp;%}
 
<pre>    {% regroup people by gender as gender_list&nbsp;%}
 
     {% regroup people|dictsort:"gender" by gender as gender_list&nbsp;%}
 
     {% regroup people|dictsort:"gender" by gender as gender_list&nbsp;%}
Рядок 38: Рядок 28:
 
     &lt;/ul&gt;
 
     &lt;/ul&gt;
 
</pre>  
 
</pre>  
−
 
+
== Шаблон форми ==  
−
== 3. Шаблон форми ==  
 
 
<pre>&lt;form method="post" action=""&gt;
 
<pre>&lt;form method="post" action=""&gt;
 
&lt;dl&gt;
 
&lt;dl&gt;
Рядок 51: Рядок 40:
 
&lt;input type="submit" /&gt;
 
&lt;input type="submit" /&gt;
 
&lt;/form&gt;
 
&lt;/form&gt;
−
 
 
</pre>  
 
</pre>  
−
 
+
== Робота з формою в views.py ==
−
== 4. Робота з формою в views.py ==
 
−
 
 
 
  instance = Instance(required_field='value')
 
  instance = Instance(required_field='value')
 
  form = InstanceForm(request.POST, instance=instance)
 
  form = InstanceForm(request.POST, instance=instance)
Рядок 64: Рядок 50:
 
  new_instance = instance.save()
 
  new_instance = instance.save()
  
−
5. allNodes = Form.serialize("myform");  
+
== Збереження в змінній форми ==
 +
allNodes = Form.serialize("myform");  
 +
 
  
−
6. Профілі користувачів  
+
== Профілі користувачів ==
−
   
+
  in settings.py:
−
in settings.py:
 
 
  AUTH_PROFILE_MODULE = 'projectname.UserProfile'
 
  AUTH_PROFILE_MODULE = 'projectname.UserProfile'
 
в інших відповідних файлах
 
в інших відповідних файлах
Рядок 78: Рядок 65:
 
  user_profile = u.profile.get()
 
  user_profile = u.profile.get()
  
−
7. Pagination - розбиття на сторінки
 
  
 +
== Pagination - розбиття на сторінки ==
 
  from django.core.paginator import Paginator
 
  from django.core.paginator import Paginator
 
  objects = ['john', 'paul', 'george', 'ringo']
 
  objects = ['john', 'paul', 'george', 'ringo']

Версія за 12:55, 26 липня 2010

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

Модуль для роботи із зображеннями

http://www.pythonware.com/products/pil/ 

Створення бази даних

create database exam2 charset=utf8;
ALTER DATABASE exam2 DEFAULT CHARACTER SET 'utf8'

Циклічний перебір

{% cycle 'row1' 'row2' %} 

Перегрупування в шаблоні

     {% 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>

Шаблон форми

<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>

Робота з формою в 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()

Збереження в змінній форми

allNodes = Form.serialize("myform");


Профілі користувачів

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()


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()"

22. Багато з'єднань з базою

from django.db import load_backend
myBackend = load_backend('postgresql_psycopg2') # or 'mysql', 'sqlite3', 'oracle'
myConnection = myBackend.DatabaseWrapper({
    'DATABASE_HOST': '192.168.1.1',
    'DATABASE_NAME': 'my_database',
    'DATABASE_OPTIONS': {},
    'DATABASE_PASSWORD': "",
    'DATABASE_PORT': "",
    'DATABASE_USER': "my_user",
    'TIME_ZONE': "America/New_York",})
# Now we can do all the standard raw sql stuff with myConnection.
myCursor = myConnection.cursor()
myCursor.execute("SELECT COUNT(1) FROM my_table;")
myCursor.fetchone()

23. Автоматична перегрузка коду (для Apache)

в конфіг добавляємо

WSGIScriptReloading On
WSGIReloadMechanism Process
$ touch my_project.wsgi

24. Доступ до url адмінки

from django.core import urlresolvers
url = urlresolvers.reverse('admin:mysite_product_change', args=(obj.id,))

25. Фільтрація по датам

extra_data = {"d": "date(created)"}
result = MyModel.objects.extra(extra_data).values('d').annotate(cnt=Count('pk')).order_by()

26. RAW SQL

authors = Author.objects.raw("SELECT *, age(birth_date) as age FROM library_authors")
for author in authors:
    print "%s is %s." % (author.first_name, author.age)

27. Тестовий поштовий сервер

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