A reusable Django app that allows you to add translatable tags to any other model.
To get the latest stable release from PyPi
pip install django-multilingual-tags
To get the latest commit from GitHub
pip install -e git+git://github.com/bitmazk/django-multilingual-tags.git#egg=multilingual_tags
Add multilingual_tags
to your INSTALLED_APPS
INSTALLED_APPS = (
...,
'multilingual_tags',
)
Don't forget to migrate your database
./manage.py migrate multilingual_tags
Add a generic relation to the model, that you intend to tag.
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
class UserProfile(models.Model):
# ...
# some other model stuff goes here
# ...
special_attributes = GenericRelation(
'multilingual_tags.TaggedItem',
)
Add the TaggingFormMixin
to any of your modelforms of a model, you want to
tag and configure the field with the settings dictionary. allowed_tags
configures how many tags a user may add. If it's set to 0 (default), it means,
that the input is not limited.
from django import forms
from multilingual_tags.forms.mixins import TaggingFormMixin
class UserProfileForm(TaggingFormMixin, forms.ModelForm):
tag_field = {
# ``name`` is the name of the ``GenericRelation`` that was added to
# the model
'name': 'special_attributes',
'label': _('Special Attributes'),
'help_text': _('List any special attributes separated with comma.'),
'required': False,
'max_tags': 0,
}
The form mixin will automatically add data-class="multilingual-tags-field"
to the form field. This allows you to easily add jquery-typeahead-tagging
to your field, which is included in this app.
Simply add the static files from multilingual_tags
to your template.
{% load static %}
{# Plain Bootstrap-like styles. #}
<link href="{% static "multilingual_tags/css/typeahead.tagging.css" %}" rel="stylesheet" media="screen">
{# You will also need jquery of course. #}
<script src="{% static "js/libs/jquery-1.9.1.js" %}"></script>
{# And then there's typeahead and the tagging plugin. #}
<script src="{% static "multilingual_tags/js/typeahead.bundle.min.js" %}"></script>
<script src="{% static "multilingual_tags/js/typeahead.tagging.js" %}"></script>
Then you can initialize your tagging field like so:
// The source of the tags for autocompletion
var tagsource = ['Foo', 'Bar', 'Anoter Tag', 'Even more tags',
'Such autocomplete', 'Many tags', 'Wow'];
// Turn the input into the tagging input
$('[data-class="multilingual-tags-field"]').tagging(tagsource);
Et voila! That should really be all there is.
For easier access later on, you can store the user, that the tagged item belongs
to on the TaggedItem
itself. The form mixin will check if the instance of
the ModelForm
you use it with has a get_user
method for that matter.
class MyObject(models.Model):
# here goes my model implementation
def get_user(self):
"""Here I can return the user I want on the TaggedItem"""
return self.user
To add tags to a model, you have to add the TaggedItemInline
to
that model's admin. In your own apps, you can just do the following:
from django.contrib import admin
from multilingual_tags.admin import TaggedItemInline
from my_app import models
class MyModelAdmin(admin.ModelAdmin):
inlines = [TaggedItemInline]
admin.site.register(models.MyModel, MyModelAdmin)
This will render the inline admin form for adding tagged items.
If you want to add tags to a third party app, you might need to import its
admin instead of Django's ModelAdmin
and then unregister and re-register
the model. One way to do it would be this:
from django.contrib import admin
from multilingual_tags.admin import TaggedItemInline
from other_app.admin import SomeModelAdmin
from other_app.models import SomeModel
class SomeModelCustomAdmin(SomeModelAdmin):
# be careful, if the other admin also defines admins, you need to add
# them as well
inlines = SomeModelAdmin.inlines + [TaggedItemInline]
admin.site.unregister(SomeModel)
admin.site.register(SomeModel, SomeModelCustomAdmin)
To get all the tags for an object, you can simply use the TagManager:
# Get all tags for a certain model instance
>> Tag.objects.get_for_obj(mymodel_instance)
[<Tag: mytag>, <Tag: myothertag>]
# .. or get all tags for an entire queryset
>> Tag.objects.get_for_queryset(MyModel.objects.all())
[<Tag: mytag>, <Tag: myothertag>]
If you want to contribute to this project, please perform the following steps
# Fork this repository
# Clone your fork
mkvirtualenv -p python2.7 django-multilingual-tags
make develop
git co -b feature_branch master
# Implement your feature and tests
git add . && git commit
git push -u origin feature_branch
# Send us a pull request for your feature branch