Django рдореЗрдВ рдХрд╕реНрдЯрдо рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб


рд╣рд╛рдп, рд╣реЗрдмреНрд░!
рдореИрдВ Django рдврд╛рдВрдЪреЗ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ рдФрд░ рдореИрдВ рдЕрдкрдиреА рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЙрд╕ рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдЖрдЬ рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореВрд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдлреЙрд░реНрдо рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд╕реНрдЯрдо рдлрд╝реАрд▓реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЛ рд░реЛрд╢рди рдХрд░рдирд╛ рд╣реИред
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ред рдПрдХ рдмрд╛рд░, рдореИрдВ рдЙрд╕ рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреНрдЮрд╛рди рдХрд╛ рдЖрдзрд╛рд░ рдмрдирд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЙрд╕ рд╕рдордп рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЖрдзрд╛рд░ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд▓реЗрдЦреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдерд╛ред рдЯреИрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рддрддреНрд╡ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИрдВ:

рдХреБрдЫ рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ jQuery рдЯреИрдЧ-рдЗрдЯ рдкреНрд▓рдЧрдЗрди рдорд┐рд▓рд╛ ! рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдХреЗрд╡рд▓ Django рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкреЗрдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред


рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд


рд╣рдорд╛рд░рд╛ рд╡рд┐рдЬреЗрдЯ рдореЙрдбрд▓ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЗрдЧрд╛, рдЬрд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЯреИрдЧ рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ
from django.db import models from unicodedata import category from django.utils.http import urlquote import re class Tag(models.Model): """ Model of Tags """ name = models.CharField(max_length=200, null=False, verbose_name="Tag name") slug = models.CharField(max_length=400, editable=False, verbose_name=u'Slug', unique=True, null=False) def __unicode__(self): return self.name @staticmethod def _generate_slug(value): slug = ''.join(ch for ch in value[:200] if category(ch)[0] != 'P') return urlquote(re.sub(r'([ ]+_)|(_[ ]+)|([ ]+)', '_', slug)) def save(self, *args, **kwargs): self.name = self.name.lower() self.slug = self._generate_slug(self.name) super(Tag, self).save(*args, **kwargs) @classmethod def get_or_create(cls, value): slug = cls._generate_slug(value.lower().strip()) if cls.objects.filter(slug=slug).exists(): return cls.objects.get(slug=slug) else: return cls.objects.create(name=value.lower().strip()) 

рдЪреВрдВрдХрд┐ рдЯреИрдЧ рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдЕрдиреНрдп рдХрдЪрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдореЙрдбрд▓ рдореЗрдВ рд╕реНрд▓рдЧ рдлрд╝реАрд▓реНрдб рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреИрдЧ рдХреЛ рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЯреИрдЧ рдирд╛рдо рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдХрд┐рддрдиреЗ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣реЛрдВред рд╣рдо рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ get_or_create рднреА рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдПрдХ рдЯреИрдЧ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рдЕрдиреНрдпрдерд╛ рдПрдХ рдирдпрд╛ рдЯреИрдЧ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирдпрд╛ рдЯреИрдЧ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдЗрд╕реЗ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдиреАрдЪреЗ рдХреА рддрд░рдл рдбрд╛рд▓рд╛ред

рдСрдЯреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ


рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рджреГрд╢реНрдп рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╡рд░реНрдгреЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯреИрдЧ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред
рдЯреИрдЧ-рдпрд╣ рдкреНрд▓рдЧрдЗрди! рд╢рдмреНрдж рдЪрд░ рдореЗрдВ рджрд░реНрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
 from models import Tag from django.http import HttpResponse import json def tag_autocomplete(request): """ url: /tag_autocomplete/""" value = request.GET['term'] available_tags = Tag.objects.filter(name__startswith=value.lower()) response = HttpResponse(json.dumps([unicode(tag) for tag in available_tags]), content_type="application/json") return response 


рд╡рд┐рдЬреЗрдЯ рдФрд░ рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб


рд╡рд┐рдЬреЗрдЯ рдФрд░ рдлреЙрд░реНрдо рдлреАрд▓реНрдб рдХреЛ рд╕реАрдзреЗ рдЙрдирдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕реНрдерд╛рди рдкрд░ - рдлреЙрд░реНрдордореЗрдХреНрд╕реЛ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдереАред
рдореБрдЭреЗ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗ рд╡рд┐рдЬреЗрдЯ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ-рдЗрдЯ рдкреНрд▓рдЧрдЗрди рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░рддрд╛ рд╣реИ! ..
 from django import forms class TagitWidget(forms.HiddenInput): """ Widget on the basis of Tag-It! http://aehlke.github.com/tag-it/""" class Media: js = (settings.STATIC_URL + 'js/tag-it.js', settings.STATIC_URL + 'js/tagit_widget.js',) css = {"all": (settings.STATIC_URL + 'css/jquery.tagit.css',)} 

рдЯреИрдЧ-it.js рдФрд░ jquery.tagit.css рдЯреИрдЧ-рдЗрдЯ рдкреНрд▓рдЧрдЗрди рдХреА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ! .. tagit_widget.js рдХреА рд╕рд╛рдордЧреНрд░реА рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред

 class TagitField(forms.Field): """ Tag field """ widget = TagitWidget def __init__(self, tag_model, *args, **kwargs): self.tag_model = tag_model super(TagitField, self).__init__(*args, **kwargs) def to_python(self, value): tag_strings = value.split(',') return [self.tag_model.get_or_create(tag_string) for tag_string in tag_strings if len(tag_string) > 0] def validate(self, value): if len(value) == 0 and self.required: raise ValidationError(self.error_messages['required']) def prepare_value(self, value): if value is not None and hasattr(value, '__iter__'): return ','.join((unicode(tag) for tag in value)) return value def widget_attrs(self, widget): res = super(TagitField, self).widget_attrs(widget) or {} res["class"] = "tagit" return res 

рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ, рд╡рд┐рдЬреЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдХ рдЯреИрдЧ рдореЙрдбрд▓ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ to_python рд╡рд┐рдзрд┐ рдореЗрдВ рдЯреИрдЧ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╡рд┐рдзрд┐ рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреА рд╣реИред Widget_attrs рдкрджреНрдзрддрд┐ рдореЗрдВ, "рдлрд╝реАрд▓реНрдб" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЫрд┐рдкреЗ рд╣реБрдП рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдиреНрд╣реЗрдВ рдЯреИрдЧ-рдЗрдЯ рдкреНрд▓рдЧрдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдЦреЛрдЬреЗрдЧреА! ...
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рдпрдВ tagit_widget.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рдореНрди рд░реВрдк рд╣реИрдВ:
 $(document).ready(function() { $(".tagit").tagit({ allowSpaces: true, autocomplete: {delay: 0, minLength: 2, source: "/tag_autocomplete/" } }); }); 

рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓рдЧрдЗрди рд╡рд┐рдХрд▓реНрдк рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдореИрдВ рдЯреИрдЧ (рд░рд┐рдХреНрдд рд╕реНрдерд╛рди) рдХреЛ рдЯреИрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВ, рдкреНрд░рд╡реЗрд╢ (рджреЗрд░реА) рдХреЗ рдмрд╛рдж рдмрд┐рдирд╛ рджреЗрд░реА рдХреЗ рдСрдЯреЛ-рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рджреВрд╕рд░реЗ рд╡рд░реНрдг рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (minLength) рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ (рд╕реНрд░реЛрдд) рд╕реЗ рд╡рд┐рдХрд▓реНрдк рд▓реЗ рд░рд╣рд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрджрд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 from models import Tag class SomeForm(forms.Form): tag = TagitField(Tag, label='Tags', required=True) 

рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЗрд╕ рдлреЙрд░реНрдо рд╕реЗ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ
 <!doctype html> <html> <head> <title>Tag-It!</title> {{some_form.media}} </head> <body> <form action=""> {{some_form.as_p}} </form> </body> </html> 

рдПрдХ рдЕрдЪреНрдЫрд╛ django рдХреЛрдбрд┐рдВрдЧ рд╣реИред

Source: https://habr.com/ru/post/In176807/


All Articles