- PVSM.RU - https://www.pvsm.ru -
Разрабатывая постоянно сталкиваешься с разнообразными задачами, которые часто решить в лоб не удаётся. Но многие задачи уже были решены кем-то — нужно только найти это решение.
Так, день за днём я насобирал небольшую коллекцию батареек, которые сильно облегчили мне жизнь. Чем и спешу поделиться:
Как становится ясно из названия, батарейка позволяет использовать популярную библиотеку select2 [1] в своих Django-проектах.
Приложение включает в себя набор полей форм и виджетов на все случаи жизни.
В ней представлено два типа виджетов:
GitHub [2]
Документация [3]
Позволяет хранить списки значений в поле модели в виде битового массива, длина которого ограничивается максимальной длиной BigInt в используемой базе данных.
Пример использования (взят из документации):
from bitfield import BitField
class MyModel(models.Model):
flags = BitField(flags=(
'awesome_flag',
'flaggy_foo',
'baz_bar',
))
У батарейки есть существенный, на мой взгляд, недостаток — штатными средствами флаги невозможно выводить в понятном виде ни в админке, ни в собственных шаблонах. Для себя эту проблему я решил следующим образом:
from django.db import models
from django.utils.translation import ugettext_lazy as _
from bitfield import BitField
class MyModel(models.Model):
FLAGS = (
('flag1', _('flag 1 description')),
('flag2', _('flag 2 description')),
('flag3', _('flag 3 description')),
)
flags = BitField([k for k, v in FLAGS])
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
def _set_choices(self, field, choices):
self.fields[field].widget.choices = choices
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self._set_choices('flags', MyModel.FLAGS)
from django.contrib import admin
from .forms import MyModelForm
from .models import MyModel
class MyModelAdmin(admin.ModelAdmin):
form = MyModelForm
admin.site.register(MyModel, MyModelAdmin)
GitHub [4]
Существует несколько реализаций тегов для Django, но я бы хотел обратить ваше внимание на ветку machinetags из этого репозитория [5].
В этой реализации тегов добавлена возможность делить их между пространствами имён (namespaces) и, соответственно, для разных полей использовать разные наборы тегов.
Так же есть возможность присваивать тегу дополнительные значения и хранить наборы из одинаковых тегов, но с разными значениями. Честно сказать, этому я пока применения не нашел.
Мой форк на GitHub [6] с некоторыми исправлениями.
Но сам по себе модуль не поддерживает автодополнение — а это, согласитесь, очень полезная функция. Есть множество реализаций: раз [7], два [8], три [9] — это только первые ссылки из гугла.
Но ни один из них не поддерживает namespaces из описанной выше версии django-tagging, поэтому я взял на себя смелость устранить этот недостаток. Так и появился мой форк…
Никак не перепишу документацию, поэтому просто приведу пример использования:
Приложение необходимо добавить в INSTALLED_APPS и в urls.py проекта:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^tagging/', include('tagging_autosuggest.urls')),
)
И добавить нужные поля в модель:
from django.db import models
from tagging_autosuggest.fields import TagAutosuggestField
class MyModel(models.Model):
tags1 = TagAutosuggestField(namespace='ns1', max_length=300)
tags2 = TagAutosuggestField(namespace='ns2', max_length=300)
Результат:
GitHub [10]
Ещё одна батарейка, облегчающая работу со списками. Создаёт в админке удобные виджеты с автодополнением для полей типа CharField, ForeignKey, ManyToMany, а также для generic-связей (ForeignKey и M2M).
Примеры использования можно посмотреть в тестовом проекте [11].
А вот так выглядит GenericForeignKey в реальном проекте:
GitHub [12]
Документация [13]
Мой скромный вклад в opensource: github.com/Yuego?tab=repositories [14]
Сообщения об ошибках, опечатках и т. п. по традиции принимаются в личку.
Автор: Yuego
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/batarejki/39143
Ссылки в тексте:
[1] select2: http://ivaynberg.github.io/select2/
[2] GitHub: https://github.com/applegrew/django-select2
[3] Документация: http://django-select2.readthedocs.org/en/latest/
[4] GitHub: https://github.com/disqus/django-bitfield
[5] репозитория: https://github.com/garyp/django-tagging
[6] Мой форк на GitHub: https://github.com/Yuego/django-tagging
[7] раз: https://github.com/alekam/django-tagging-autocomplete
[8] два: https://github.com/pije76/django-tagging-autocomplete-tag-it
[9] три: https://github.com/originell/django-tagging-autocomplete
[10] GitHub: https://github.com/Yuego/django-tagging-autosuggest
[11] тестовом проекте: https://github.com/yourlabs/django-autocomplete-light/tree/master/test_project
[12] GitHub: https://github.com/yourlabs/django-autocomplete-light
[13] Документация: http://django-autocomplete-light.readthedocs.org/en/latest/
[14] github.com/Yuego?tab=repositories: https://github.com/Yuego?tab=repositories
[15] Источник: http://habrahabr.ru/post/187312/
Нажмите здесь для печати.