diff options
| -rw-r--r-- | blog/models.py | 10 | ||||
| -rw-r--r-- | blog_admin/views.py | 22 | ||||
| -rw-r--r-- | templates/blog_admin/new_post.html | 33 |
3 files changed, 43 insertions, 22 deletions
diff --git a/blog/models.py b/blog/models.py index 1d273b5d..1618f60b 100644 --- a/blog/models.py +++ b/blog/models.py @@ -10,6 +10,11 @@ class Category(models.Model): description = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True) + def save(self, *args, **kwargs): + if not self.slug or self.slug == '': + self.slug = slugify(self.name) + return super(Category, self).save(*args, **kwargs) + def __str__(self): return self.name @@ -19,6 +24,11 @@ class Tag(models.Model): description = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True) + def save(self, *args, **kwargs): + if not self.slug or self.slug == '': + self.slug = slugify(self.name) + return super(Tag, self).save(*args, **kwargs) + def __str__(self): return self.name diff --git a/blog_admin/views.py b/blog_admin/views.py index 29b1f0aa..49e309a3 100644 --- a/blog_admin/views.py +++ b/blog_admin/views.py @@ -36,12 +36,16 @@ def posts_search(request): def new_post(request): if request.user.is_authenticated and (request.user.is_superuser or request.user.is_staff): categories = Category.objects.all() + all_tags = [tag.name for tag in Tag.objects.all()] if request.method == 'POST': title = request.POST.get('title') category = request.POST.get('category') - tags = request.POST.get('tags') + tags = request.POST.getlist('tags') slug = request.POST.get('slug') if request.POST.get('slug') else '' post_image = request.FILES['post_image'] if 'post_image' in request.FILES else None + additional_tags = request.POST.get('additional_tags') if request.POST.get('additional_tags') else '' + if additional_tags: + tags += additional_tags.split(',') if request.POST.get('post_id'): # update post @@ -52,7 +56,7 @@ def new_post(request): post.title = title post.category = Category.objects.get(id = category) post.slug = slug - post.tags.set([Tag.objects.get_or_create(slug = tag.strip(), name = tag.strip())[0] for tag in tags.split(',')]) + post.tags.set([Tag.objects.get_or_create(name = tag.strip())[0] for tag in tags]) if post_image: post.post_image = post_image post.save() @@ -64,13 +68,13 @@ def new_post(request): else: if not title or not category or not tags or not post_image: messages.error(request, 'Fields marked with asterisk (*) are required.', extra_tags='new_post_message') - return_object = { 'title_value': title, 'category_value': category, 'tags_value': tags, 'slug_value': slug, 'post_image_value': post_image } + return_object = { 'title_value': title, 'category_value': category, 'tags_value': tags, 'slug_value': slug, 'post_image_value': post_image, 'all_tags': all_tags } return render(request, 'blog_admin/new_post.html', { 'title': 'New Post', 'categories': categories, 'return_object': return_object }) else: # create new post try: post = Post.objects.create(title = title, category = Category.objects.get(id = category), slug = slug, author = request.user, post_image = post_image) - post.tags.set([Tag.objects.get_or_create(slug = tag.strip(), name = tag.strip())[0] for tag in tags.split(',')]) + post.tags.set([Tag.objects.get_or_create(name = tag.strip())[0] for tag in tags]) post.save() return redirect(reverse('blog-admin:edit-post', kwargs = { 'slug': post.slug })) except Exception as e: @@ -86,13 +90,11 @@ def new_post(request): post_id = None mode = 'new' if mode == 'edit' and post_id: - post_tags = post.tags.all() - post_tags = [tag.name for tag in post_tags] - post_tags = ', '.join(post_tags) - post = { 'id': post.id, 'title': post.title, 'category': post.category.id, 'tags': post_tags, 'slug': post.slug, 'post_image': post.post_image } - return render(request, 'blog_admin/new_post.html', { 'title': 'Edit Post', 'categories': categories, 'post': post }) + post_tags = [tag.name for tag in post.tags.all()] + post = { 'id': post.id, 'title': post.title, 'category': post.category.id, 'tags': post_tags, 'slug': post.slug, 'post_image': post.post_image, 'all_tags': all_tags } + return render(request, 'blog_admin/new_post.html', { 'title': 'Edit Post', 'categories': categories, 'post': post, 'all_tags': all_tags }) - return render(request, 'blog_admin/new_post.html', { 'title': 'Create New Post', 'categories': categories }) + return render(request, 'blog_admin/new_post.html', { 'title': 'Create New Post', 'categories': categories, 'all_tags': all_tags }) else: return redirect('blog:home') diff --git a/templates/blog_admin/new_post.html b/templates/blog_admin/new_post.html index 4c9cc73c..9984ab9d 100644 --- a/templates/blog_admin/new_post.html +++ b/templates/blog_admin/new_post.html @@ -56,10 +56,19 @@ <tr> <td style="font-weight: bold; padding-right: 20px;">Tags <sup>*</sup></td> <td> - <input type="text" name="tags" placeholder="tag1,tag2,tag3..." {% if post %} value="{{ post.tags }}" {% endif %} {% if return_object %} value="{{ return_object.tags_value }}" {% endif %} required/> + <select name="tags" multiple="multiple" required> + {% for tag in all_tags %} + <option value="{{ tag }}" {% if post and tag in post.tags %} selected {% endif %} {% if return_object and tag in return_object.tags_value %} selected {% endif %}>{{ tag }}</option> + {% endfor %} + </select> </td> </tr> <tr> + <td style="font-weight: bold; padding-right: 20px;">Additional Tags</td> + <td> + <input type="text" name="additional_tags" placeholder="Comma-Separated Additional Tags" {% if return_object %} value="{{ return_object.additional_tags_value }}" {% endif %} /> + </td> + <tr> <td style="font-weight: bold; padding-right: 20px;">Category <sup>*</sup></td> <td> <select name="category"> @@ -74,16 +83,16 @@ <input type="submit" class="button button-special" {% if post %} value="Update Post" {% else %} value="Create Post" {% endif %} /> </form> <script> - function slugify(text) { - return text.toString().toLowerCase() - .replace(/\s+/g, '-') // Replace spaces with - - .replace(/[^\w\-]+/g, '') // Remove all non-word chars - .replace(/\-\-+/g, '-') // Replace multiple - with single - - .replace(/^-+/, '') // Trim - from start of text - .replace(/-+$/, '') - .replace(/[^a-z0-9]/gi, ' ').trim(); - } - + String.prototype.slugify = function (separator = "-") { + return this + .toString() + .normalize('NFD') // split an accented letter in the base letter and the acent + .replace(/[\u0300-\u036f]/g, '') // remove all previously split accents + .toLowerCase() + .trim() + .replace(/[^a-z0-9 ]/g, '') // remove all chars not letters, numbers and spaces (to be replaced) + .replace(/\s+/g, separator); + }; function customSlugToggle() { var ag_slug = document.getElementById('ag_slug'); @@ -98,7 +107,7 @@ slug.style.display = 'none'; slug_btn.innerHTML = 'Use custom slug?'; var title = document.getElementById('title'); - slug.value = slugify(title.value); + slug.value = title.value.slugify(); } } </script> |
