Django tag split failed
i want split whether "," or ";" so i setted, but it is not working well..
for example, when i input tags by text
python, django; sky
Hi, i want split whether "," or ";" so i setted, but it is not working well..
for example, when i input tags by text
python, django; sky
like this
but result is
from blog.models import Post
...: post = Post.objects.last()
...: print(post.tags.all()) # 태그 개별 저장 확인
<QuerySet [<Tag: python; django; sky tag>]>
how can i fix it?
i will give to you my part of models.py, views.py
# models.py
from django.db import models
from django.contrib.auth.models import User
import os
class Tag(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=200, unique=True, allow_unicode=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return f"/blog/tag/{self.slug}/"
class Post(models.Model):
title = models.CharField(max_length=30)
# 후킹해주는 메세지 100글자 한도로 노출
hook_text = models.CharField(max_length=100, blank=True)
content = models.TextField()
# auto_now=True를 해주면, 추가로 입력해줄 것 없이, 해당되는 내용이 자동 등록 된다.
# settings에 MEDIA_URL, MEDIA_ROOT로 넣어주었던 주소 뒤로 어떻게 해줄지를 말해준다.
head_image = models.ImageField(upload_to="blog/images/%Y/%m/%d/", blank=True)
file_upload = models.FileField(upload_to="blog/files/%Y/%m/%d/", blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# CASCADE는 연결되어있는 값도 같이 삭제 해준다는 뜻
# SET_NULL은 해당 값을 삭제해도, 해당 pk 값은 공백으로 두되, 나머지 데이터는 살려두는 것
# blank=True를 해줘야 카테고리 미 추가시 오류가 뜨지 않는다.
author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.SET_NULL)
tags = models.ManyToManyField(Tag, blank=True)
# 이걸로써, 관리자 단에서 내용을 보게 되면 작성된 텍스트로 표시된다.
def __str__(self):
return f"[{self.pk}]{self.title} :: {self.author}"
def get_absolute_url(self):
return f"/blog/{self.pk}/"
def get_file_name(self):
return os.path.basename(self.file_upload.name)
def get_file_ext(self):
return self.get_file_name().split(".")[-1]
# views.py
from django.shortcuts import render, redirect
from django.views.generic import ListView, DetailView, CreateView, UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from .models import Post, Category, Tag
from django.db.models import Count
from django.core.exceptions import PermissionDenied
from django.utils.text import slugify
import re
class PostList(ListView):
model = Post
ordering = "-pk"
# template_name = "blog/index.html"
def get_context_data(self, **kwargs):
context = super(PostList, self).get_context_data()
context["categories"] = Category.objects.annotate(post_count=Count('post'))
context["no_category_post_count"] = Post.objects.filter(category=None).count()
# context["category"] = None
return context
class PostList(ListView):
model = Post
ordering = "-pk"
# template_name = "blog/index.html"
def get_context_data(self, **kwargs):
context = super(PostList, self).get_context_data()
context["categories"] = Category.objects.annotate(post_count=Count('post'))
context["no_category_post_count"] = Post.objects.filter(category=None).count()
# context["category"] = None
return context
class PostDetail(DetailView):
model = Post
def get_context_data(self, **kwargs):
context = super(PostDetail, self).get_context_data()
context["categories"] = Category.objects.annotate(post_count=Count('post'))
context["no_category_post_count"] = Post.objects.filter(category=None).count()
return context
class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
model = Post
fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']
def test_func(self):
return self.request.user.is_superuser or self.request.user.is_staff
def form_valid(self, form):
current_user = self.request.user
if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
form.instance.author = current_user
response = super(PostCreate, self).form_valid(form)
tags_str = self.request.POST.get('tags_str')
if tags_str:
tags_str = tags_str.strip()
tags_str = tags_str.replace(',', ';')
tags_list = tags_str.split(';')
for t in tags_list:
t = t.strip()
tag, is_tag_created = Tag.objects.get_or_create(name=t)
if is_tag_created:
tag.slug = slugify(t, allow_unicode=True)
tag.save()
self.object.tags.add(tag)
return response
else:
return redirect('/blog/')
class PostUpdate(LoginRequiredMixin, UpdateView):
model = Post
fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']
template_name = 'blog/post_update_form.html'
def get_context_data(self, **kwargs):
context = super(PostUpdate, self).get_context_data()
if self.object.tags.exists():
tags_str_list = list()
for t in self.object.tags.all():
tags_str_list.append(t.name)
context['tags_str_default'] = '; '.join(tags_str_list)
return context
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated and request.user == self.get_object().author:
return super(PostUpdate, self).dispatch(request, *args, **kwargs)
else:
raise PermissionDenied
def form_valid(self, form):
response = super(PostUpdate, self).form_valid(form)
self.object.tags.clear()
tags_str = self.request.POST.get('tags_str')
if tags_str:
tags_str = tags_str.strip()
tags_str = tags_str.replace(',', ';')
tags_list = tags_str.split(';')
for t in tags_list:
t = t.strip()
tag, is_tag_created = Tag.objects.get_or_create(name=t)
if is_tag_created:
tag.slug = slugify(t, allow_unicode=True)
tag.save()
self.object.tags.add(tag)
return response
def tag_page(request, slug):
tag = Tag.objects.get(slug=slug)
post_list = tag.post_set.all()
return render(
request,
"blog/post_list.html",
{
"post_list": post_list,
"tag" : tag,
"categories" : Category.objects.annotate(post_count=Count('post')),
"no_category_post_count" : Post.objects.filter(category=None).count()
}
)
if someone knows what is that problem, please let me know