aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blog/models.py10
-rw-r--r--blog_admin/views.py22
-rw-r--r--templates/blog_admin/new_post.html33
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>