Автор: admin

  • django devserver статические файлы ( django devserver static files)

    Во время разработки нужно чтоб статика обрабатывалась dev сервером, всякие файлы стилей js и т.п.

    Для решения этой задачи я использую вот это:

    urls.py

    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/home/django/list/static'}),Code language: Python (python)

    в корне проекта создаю каталог static, в котором создаю подкаталоги js images style и т.п

  • Django ajax пример ( django ajax autocomplite)

    Продолжаю понемногу разбираться в Django

    Дошло до авто заполнения полей, пару дней перечитывал все «Интернеты» о разных вариантах и методах, о готовых примерах и т.п.

    И так начнём я воспользовался jQuery плагином Autocomplete
    Всё это я брал вот тут
    Плагин совсем не полный ищет так себе похоже просто старый.
    Поэтому идём и берём самый новый ..

    тут оно будет работать без основного jQuery

    Но на других страницах проекта, есть более полные версии и более красивые.
    Вот их и качаем
    Из них нам нужны
    в папочку css кидаем

    indicator.gif
    jquery.autocomplete.cssCode language: HTML, XML (xml)

    в папочку js кидаем

    jquery-1.5.min.js
    jquery.autocomplete.min.jsCode language: HTML, XML (xml)

    Поехали, предположим, что у нас есть в urls.py

    (r'^asearch/$', 'man.views.ajax_search'),Code language: Python (python)

    man.views.ajax_search — я думаю рассказывать не надо, что это своё приложение и Вьюха его

    во views.py

    def ajax_search(request):
         if request.method == 'GET':  
             GET = request.GET  
             if GET.has_key('q'):
                 q = request.GET.get( 'q' )
                 search = Task.objects.all()
                 results = search.filter(name__contains = q)
                 matches = ""
                 for result in results:
                     matches = matches + "%s\n" % (result.name)
                 return HttpResponse(matches, mimetype="text/plain") 
     Code language: Python (python)

    В данном примере мы будет общаться через обычный get запрос.
    Можно сделать «не обычным»
    например так

    if request.is_ajax():
    q = request.GET.get( 'q' )Code language: Python (python)

    Но об этом попробую ещё написать, когда буду более тонко в этом разбираться
    В модели Task мы делаем поиск по полю «name».
    Потом всё это выстраиваем в красивый список с переносами строк
    в итоге в переменной matches у нас будет уже структурированный список.

    Теперь на стороне клиента.

    Во первых подключаем плагин со стилями и jquery

    <script src="/static/js/jquery-1.5.min.js" type="text/javascript"></script>
    <script src="/static/js/jquery.autocomplete.min.js" type="text/javascript"></script>
    <link type="text/css" rel="stylesheet" href="/static/css/jquery.autocomplete.css">Code language: HTML, XML (xml)

    Добавим простую функцию jQ

    <script type="text/javascript">
       $(document).ready(function() {  
           $("#q1").autocomplete("/asearch/");  
        });  
    </script>Code language: HTML, XML (xml)

    Тут мы говорим плагину: находим элемент с id=»q1″ и будем с ним работать.
    А всё запросы отправлять на урл «/asearch/»

    дальше собственно сам элемент

    <input id="q1" type="text" />Code language: HTML, XML (xml)

    Вот собственно и всё.

  • django-registration Пример

    Мопед не мой, был в песочнице на хабре, потом в кэше гугла, чтоб совсем не потерялся решил оставить себе, был бы у меня инвайт, обязательно выслал, а так пока ещё не заслужил 🙁

    В интернете есть много разрозненной информации о django-registration и о расширении стандартной модели Users. Однако, тотального примера, которое позволило бы новичку вникнуть как реализовать задуманную им логику регистрации нет. Я попробовал восполнить этот пробел.

    Поставим себе следующие техническое задание:

    * Во время регистрации пользователь заполняет дополнительные поля.
    * При отправке формы — вся информация сохраняется в профайле, и на почту высылается письмо с ссылкой для активации.
    * При переходе по ссылке пользователь активирует свою учетную запись, автоматически авторизуется на сайте, и перенаправляется на определенную страницу.

    Сразу отметим что по умолчанию django-registration не включает в себя сохранение дополнительных полей, и после активация записи приходится вводить свой логин и пароль для авторизации.

    Расширение модели User

    Расширять модель пользователя мы будем соединением нашей модели Profile с стандартной моделью User посредством поля AutoOneToOneField. Подробнее об этом здесь.

    Для начала создадим новое приложение profile:

    django-admin.py startapp profileCode language: Python (python)

    Заходим в созданную папку profile, и открываем для редактирования файл models.py. В нашем примере, мы расширим модель пользователя полем проффесия, при чем посетитель сайта при регистрации будет выбирать проффесию из списка. Для удобного редактирования этого списка, мы вынесем его в отдельную модель Work. И так, models.py у нас обрастет таким кодом:

    #profile/models.py
    # -*- coding: utf-8 -*-
    from django.db import models
    from django.contrib.auth.models import User
    from habr.profile.fields import AutoOneToOneField
    
    class Work(models.Model):
        work = models.CharField(max_length = 100, verbose_name = 'Работа')
    
    class Profile(models.Model):
        user = AutoOneToOneField(User, related_name='profile', verbose_name=('User'), primary_key=True)
        work = models.ForeignKey(Work, verbose_name = 'Вид деятельности')Code language: Python (python)

    Мы подключаем поле AutoOneToOneField. Создадим в каталоге profile файл fields.py с таким кодом:

    #profile/fields.py
    # -*- coding: utf-8 -*-
    
    from django.db.models import OneToOneField
    from django.db.models.fields.related import SingleRelatedObjectDescriptor
    
    class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor):
        def __get__(self, instance, instance_type=None):
        try:
            return super(AutoSingleRelatedObjectDescriptor, self).__get__(instance, instance_type)
        except self.related.model.DoesNotExist:
            obj = self.related.model(**{self.related.field.name: instance})
            obj.save()
        return obj
    
    class AutoOneToOneField(OneToOneField):
        def contribute_to_related_class(self, cls, related):
            setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related))Code language: Python (python)

    Осталось добавить приложение в INSTALLED_APPS (файл настроек settings.py), а также указать директиву AUTH_PROFILE_MODULE:

    #settings.py
    INSTALLED_APPS = (
    ##
    'habr.profile',
    ##
    )
    AUTH_PROFILE_MODULE = 'habr.profile.profile'Code language: Python (python)

    Этот этап пройден, выполняем python manage.py syncdb и смотрим как создаются новые таблицы.

    Прикручиваем и кастомизируем django-registration

    Django-registration — это модуль который позволяет легко реализовать на сайте регистрацию с авторизацией по электронной почте (либо без онной). Достаточно подробно о её установке написано здесь, мы же пробежимся по основным нюансам, и займемся кастомизацией.

    Для установки django-registration достаточно просто скачать её отсюда, разархивировать архив и положить папку registration в корневую папку вашего проекта. Однако, так поступать категорически не рекомендуется, лучше воспользоватся утилитами установки easy-install либо pip. Но тут есть один нюанс, если просто выполнить:

    easy_install -Z django-registrationCode language: Bash (bash)

    установится версия 0.7, которая не поддерживает очень удобный механизм — сигналы. Поэтому, чтобы посредством easy-install установить последнюю версию 0.8, необходимо выполнить:

    easy_install-2.6 cdn.bitbucket.org/ubernostrum/django-registration/downloads/django-registration-0.8-alpha-1.tar.gzCode language: Bash (bash)

    (Возможно, когда вы будете читать эту статью, эта версия не будет последней актуальной, так что не забудьте проверить)
    После этого следует добавить в INSTALLED_APPS — ‘registration’, а также обязательную директиву ACCOUNT_ACTIVATION_DAYS — которая устанавливает в течении скольки дней пользователь может активировать свою запись:

    #settings.py
    INSTALLED_APPS = (
    ##
    'habr.profile',
    'registration',
    ##
    )
    AUTH_PROFILE_MODULE = 'habr.profile.profile'Code language: Python (python)

    Далее необходимо сделать привязку URL, для этого редактируем файл urls.py, добавляя в urlpatterns строчку:

    url(r'^accounts/', include('registration.backends.default.urls')),Code language: Python (python)

    Теперь для работы осталось только создать шаблоны для регистрации, активации и т.д. Это опять же подробно описано здесь, не будем повторятся.
    После этого обновляем базу данных (python manage.py syncdb) и можно тестировать регистрацию. Не забудьте запустить почтовый сервер.

    Теперь мы подошли к самому интерестному — добавим поля профиля в регистрационную форму, и несколько кастомизируем регистрацию.

    Унасследуем стандартную форму модуля django-registration и добавим в неё наши поля. Создаем forms.py в папке profile:

    #profile/forms.py
    # -*- coding: utf-8 -*-
    
    from django import forms
    from registration.forms import RegistrationFormUniqueEmail
    from habr.profile.models import Work
    
    WORK_CHOICES = [
    (work.id, work.work) for work in Work.objects.all()
    ]
    
    class RegistrationFormProfile(RegistrationFormUniqueEmail):
        work = forms.ChoiceField(choices=WORK_CHOICES, label = 'Работа')Code language: Python (python)

    Обратите внимание как заполняется список выбора. При такой реализации при добавлении в таблицу Work новых строк прийдется перезагружать джангу, но зато список кешируется, и не будет происходить выполнения запроса к базе данных каждый раз при выводе формы. Такой вариант подходит когда таблицу не планируется часто изменять.

    Теперь нам надо чтобы бэкэнд django-registration использовал нашу форму вместо своей по умолчанию, для этого в urls.py перед

    url(r'^accounts/', include('registration.backends.default.urls')),Code language: Python (python)

    добавим

    url(r'^accounts/register/$', 'registration.views.register', {'backend': 'registration.backends.default.DefaultBackend', 'form_class':RegistrationFormProfile,},
    name='registration_register'),Code language: Python (python)

    И имортируем форму:

    from habr.profile.forms import RegistrationFormProfileCode language: Python (python)

    Раньше приходилось переписывать у формы метод save(), в django-registration 0.8 появилась возможность повесить сигнал на создание юзера. Также сразу повесим сигнал на активацию юзера, для того чтобы сразу провести авторизацию.

    Создадим signals.py в папке profile:

    #profile/signals.py
    # -*- coding: utf-8 -*-
    
    from registration.signals import user_registered, user_activated
    from habr.profile.models import Profile
    from forms import RegistrationFormProfile
    from django.contrib import auth
    
    def user_created(sender, user, request, **kwargs):
        form = RegistrationFormProfile(request.POST)
        profile = Profile(user=user, work_id = int(form.data['work']))
        profile.save()
    
    def login_on_activation(sender, user, request, **kwargs):
        user.backend='django.contrib.auth.backends.ModelBackend'
        auth.login(request,user)
    
    user_activated.connect(login_on_activation)
    user_registered.connect(user_created)Code language: Python (python)

    Теперь осталась импортировать эти функции в urls.py:

    from habr.profile.signals import *Code language: Python (python)

    Остался последний штрих — мы хотим чтобы после регистрации пользователь попадал на определенную целевую страницу, для этого можно просто повесить представление на url accounts/activate/complete/:

    url(r'^accounts/activate/complete/$', 'gamb.profile.views.redirect_after_activation'),Code language: Python (python)

    Техническое задание выполнено!

  • pindgin facebook /usr/share/pixmaps/pidgin/protocols/16/facebook.png

    Любимая убунту недавно порадовала рекурсией, пыталась перустановить пакет pidgin и ей этого не удавалось, не могла удалить
    /usr/share/pixmaps/pidgin/protocols/16/facebook.png вот этот файл, ручное удаление не помогало, дело в том, что последняя версия pidgin конфликтует с пакетом pidgin-facebookchat

    Вот после его удаления всё наладилось

  • Обновление Linux Mint 9 до 10

    А вот и хрен вам, оказывается, не поддерживает эту идеалогию дистрибутив, у меня убунту с 7.10 шла сама до 10.10
    А тут нет, говорит бэкапь данные и делай fresh install.
    Обидно, чтож… люблю я получать новые свистелки и перделки через инет, не прерываясь.

    слил свежий Минт. посмотрим… долго настраивается вся эта среда разработки 🙁

    Хотя это же та же убунта, и подену имён в репозитории никто не отменял.

    Редактируем

    sudo gedit /etc/apt/sources.listCode language: Bash (bash)

    Удаляем всё и добавляем вот это

    deb http://packages.linuxmint.com/ julia main upstream import
    deb http://archive.ubuntu.com/ubuntu/ maverick main restricted universe multiverse
    deb http://archive.ubuntu.com/ubuntu/ maverick-updates main restricted universe multiverse
    deb http://security.ubuntu.com/ubuntu/ maverick-security main restricted universe multiverse
    deb http://archive.canonical.com/ubuntu/ maverick partner
    deb http://packages.medibuntu.org/ maverick free non-freCode language: Bash (bash)

    Сохраняем закрываем

    Теперь обновляем

    sudo apt-get update
    sudo apt-get dist-upgradeCode language: Bash (bash)

    После завершения на последок

    sudo apt-get upgradeCode language: Bash (bash)

    ну и перезагружаемся