Написана на python
https://github.com/squadette/sqlup
Продолжение записи Интернационализация и локализация django.
Для перевода яваскрипта нужно
-
В urls.py добавить урл для подгрузки функций интернационализации
url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', {'packages': ('my_project',),})словарь packages должен содержать один из пакетов, указанных в INSTALLED_APPS.
-
Добавить в шаблон подгрузку это скрипта
<script type="text/javascript" src="/jsi18n/"></script>
- В нужных местах воспользоваться функциями gettext, ngettext или interpolate
-
Создаём файл с переводами для js командой
django-admin makemessages -d djangojs -l ru
- Добавляем перевод в файл и компилируем его так же как и для переводов серверной части django
На примере русского языка.
Continue reading »
Никак не мог придумать, как озаглавить статью). Просто есть две вещи, которые хотел упомянуть.
Создаём метод класса, возвращающий модели класса, который может вернуть и только указанные поля всех удовлетворяющих условиям моделей.
from django.db import models from django.contrib.auth.models import User from django.db.models import Q class Exercise( models.Model ): name = models.CharField( max_length = 255 ) is_paired = models.BooleanField( default = False ) user = models.ForeignKey( User, blank = True, null = True ) @classmethod def getExercisesForUser(cls, User, Fields = ()): query = cls.objects.filter(Q(user = None) | Q(user = User)) if Fields: query = query.only(*Fields) return query
Здесь нужно выделить два важных момента:
-
cls.objects.filter(Q(user = None) | Q(user = User))
Здесь создаётся фильтр моделей, созданных конкретным пользователем или не относящимся ни к какому пользователю. Подробнее о сложных запросах с Q-объектами.
-
query.only(*Fields)
Если переданы названия полей, то достаются не все поля моделей, а только конкретные. Подробнее о выборке некоторых полей моделей.
Задача стояла следующая:
сделать карточку создания-редактирования тренировки, которое состоит из упражнений, каждое из которых состоит из подходов. При этом должна быть возможность создавать тренировку по шаблону, при этом должны выводиться формы упражнений с предзаполненными данными, а также пустые определённого количества форм для ввода подходов (количество задаётся в шаблоне). Также должна сохраниться валидация всех форм, невозможность сохранения тренировок без упражнений и упражнений без подходов.
Continue reading »
Запустить новый проект
Перед запуском надо записать изменения в базу данных:
python manage.py syncdb
Также можно проверить на ошибки:
python manage.py validate
Запустить проект:
python manage.py runserver
Кстати, тут много про запуск Django в продакшн-окружении.
from django.http import HttpResponse
import simplejson as json
...
def my_view( request ):
jsonDict = { "status": "success", "message": "everything's fine" }
return HttpResponse( json.dumps( jsonDict ), mimetype="application/json" )
Подробнее о simplejson – в документации
Задача стояла следующая:
есть список сущностей (к примеру, упражнений), каждая из которых в форме выводится в виде нескольких полей ввода (к примеру, сеты и название упражнения), хочется иметь возможность яваскриптом добавлять/удалять упражнения, менять их положение.
Для этого были использованы формсеты (django.forms.formsets) и jquery на клиенте.
В теории всё так: в шаблон передаём формы из формсета (подводный камень тут – для правильной валидации нужно в шаблоне внутри формы нужно не забыть вписать скрытые инпуты, отвечающие за количество форм формсета на странице, для этого пишем в шаблоне {{ exercisesFormset.management_form }}).
В шаблоне у каждого упражнения присутствуют контролы для удаления/добавления и перемещения упражнений, после загрузки страницы ненужные контролы у каждого упражнения скрываются, а после, к примеру, добавления нового упражнения контролы перерисовываются.
Для удаления все поля ввода упражнения очищаются, после чего скрываются.
Это была теория, теперь практика. Ниже гольный код с комментариями.
Continue reading »
Хотелось использовать стандартную авторизацию, но нужно было, естественно, её расширить.
Вот как это получилось.
Continue reading »
Достаточно в urls.py добавить:
(r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': '/home/.../static'}),
Для боевого сервера этот метод, конечно, использовать не стоит, но для разработки – самое то.