(1) ๊ฐ์ฅ๋จผ์ ์๋์ ๊ฐ์ด ํ๊ทธ๋ชจ๋์ ๋ค์ด๋ฐ์์ค๋ค.
pip install django-taggit
pip install django-taggit-templatetags2
(2) settings.py์ INSTALLED_APPS ๋ถ๋ถ์ ์๋์ ๊ฐ์ด ์ถ๊ฐ ํด์ค๋ค.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tweet',
'user',
'restaurant',
'taggit.apps.TaggitAppConfig',
'taggit_templatetags2',
]
#ํ๊ทธ๋ชจ๋์ ํ์ํ ์ ๋ณด
TAGGIT_CASE_INSENSITIVE = True
TAGGIT_LIMIT = 50
(3) Tag๋ tweet๋ชจ๋ธ ์์ ๋ฃ์ ๊ฒ์ด๋ฏ๋ก ํด๋น models.py์์ ์ํฌํธ๋ฅผ ํด์ฃผ๊ณ ๋ชจ๋ธ์์ tags๋ฅผ ์ ์ํด์ค๋ค.
# tweet/models.py
from taggit.managers import TaggableManager
class TweetModel(models.Model):
class Meta:
db_table = "tweet"
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
content = models.CharField(max_length=256)
tags = TaggableManager(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
(4) ๋ชจ๋ธ์ ์ถ๊ฐํ์์ผ๋ db์ makemigrations์ migrate๋ฅผ ํ์ฉํ์ฌ ์๋ ค์ฃผ๊ณ ์ ์ฉ์ ์ํจํ ์๋์ ๊ฐ์ด ํ๋ฉด์์ 'ํ๊ทธ'๋ฅผ ์ ๋ ฅ๋ฐ๊ณ ์ ์ฅํ๋ ๋ณ์๋ฅผ ์ถ๊ฐํด์ค๋ค.
# tweet/views.py ์ tweet ํจ์
@login_required
def tweet(request):
if request.method == 'GET': # ์์ฒญํ๋ ๋ฐฉ์์ด GET ๋ฐฉ์์ธ์ง ํ์ธํ๊ธฐ
all_tweet = TweetModel.objects.all().order_by('-created_at')
return render(request, 'tweet/home.html', {'tweet': all_tweet})
elif request.method == 'POST': # ์์ฒญ ๋ฐฉ์์ด POST ์ผ๋
user = request.user # ํ์ฌ ๋ก๊ทธ์ธ ํ ์ฌ์ฉ์๋ฅผ ๋ถ๋ฌ์ค๊ธฐ
content = request.POST.get('my-content', '')
tags = request.POST.get('tag', '').split(',')
if content == '':
all_tweet = TweetModel.objects.all().order_by('-created_at')
return render(request, 'tweet/home.html', {'error': '๊ธ์ ๊ณต๋ฐฑ์ผ ์ ์์ต๋๋ค', 'tweet': all_tweet})
else:
my_tweet = TweetModel.objects.create(author=user, content=content)
for tag in tags:
tag = tag.strip()
if tag != '': # ํ๊ทธ๋ฅผ ์์ฑํ์ง ์์์ ๊ฒฝ์ฐ์ ์ ์ฅํ์ง ์๊ธฐ ์ํด์
my_tweet.tags.add(tag)
my_tweet.save()
return redirect('/tweet')
django-taggit ๋ชจ๋์์ '์ด๋ ๊ฒ ์ฌ์ฉํ์ธ์' ๋ผ๊ณ ์ ํด๋์ ํด๋์ค๋ค์ ์ถ๊ฐํด์ค๋ค.
class TagCloudTV(TemplateView):
template_name = 'taggit/tag_cloud_view.html'
class TaggedObjectLV(ListView):
template_name = 'taggit/tag_with_post.html'
model = TweetModel
def get_queryset(self):
return TweetModel.objects.filter(tags__name=self.kwargs.get('tag'))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['tagname'] = self.kwargs['tag']
return context
TagCloudTV ํด๋์ค : ํ๊ทธ๋ค์ ๋ชจ์๋๋ ํ๊ทธํด๋ผ์ฐ๋๋ฅผ ๋ง๋๋ ์ญํ
TaggedObjectLV ํด๋์ค : ํ๊ทธ๋ค์ ๋ชจ์์ ํ๋ฉด์ ์ ๋ฌํ๋ ์ญํ
(5) ๋ง์ง๋ง์ผ๋ก model๊ณผ view๊ฐ ์ค์ ์ด ๋์์ผ๋ url์ ์๋์ ๊ฐ์ด ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
urlpatterns = [
path('', views.home, name='home'),
path('tweet/', views.tweet, name='tweet'),
path('tweet/delete/<int:id>', views.delete_tweet, name='delete-tweet'),
path('tweet/<int:id>', views.detail_tweet, name='detail-tweet'),
path('tweet/comment/<int:id>', views.write_comment, name='write-comment'),
path('tweet/comment/delete/<int:id>', views.delete_comment, name='delete-comment'),
**path('tag/', views.TagCloudTV.as_view(), name='tag_cloud'),**
**path('tag/<str:tag>/', views.TaggedObjectLV.as_view(), name='tagged_object_list'),**
]
ํ์คํ flask๋ณด๋ค๋ django์์ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ด ๋ง๊ธฐ๋๋ฌธ์ ์น์ ํ ๋๋์ด ๊ฐํ๋ค. ํ์ง๋ง ์ด๋ฅผ ๋ด๊ฐ์ํ๋๋๋ก ์ํฉ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์๋ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ ๊ฒ๊ฐ๋ค. ๊ณง ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ๋ ์๋๊ณ ์๊ธฐ๋๋ฌธ์ django๋ฅผ ํ์ฉํด์ ์ํ ์ ์์์ง ๋ถ๋ด์ด ๋๋ค. ํ์ง๋ง ๊ฐ ๋ฐฐ์ด ์ค๋ ฅ์ด๊ธฐ๋ํ๊ณ , ๊ฒฐ๊ณผ๋ฌผ๋ณด๋ค๋ ์ด์ฌํ ํ ๊ณผ์ ์ ๋จ๊ธฐ๊ณ ์ถ๋ค.
๐ ์์ธํ ์ฝ๋๋ Moonmoo ์ ๊ฒ์ํ์ต๋๋ค
์ค๋๋ ์์ธ์๋ TIL!! ๋๋จํ์ญ๋๋ค :)