Notice
Recent Posts
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
관리 메뉴

Folevel

[TIL - 24. 08. 26] Django 팀과제 본문

I Learned/Today I Learned

[TIL - 24. 08. 26] Django 팀과제

NADARA 2024. 8. 26. 20:50

 

 

오늘은 해시태그 기능을 구현했다. 진행하다가 막히는 부분이 너무 많아서 manytomanyfield에 대해 다시 공부하고 진행했다. 몇시간 동안이나 고민했던 문제가 강의 듣고 진행하니 너무 쉽게 풀렸다. 기본을 간과하고 그냥 머리 박다가는 내 머리만 깨진다는 교훈을 얻었다. 

 

@login_required
def hashtag(request, hash_pk):
    hashtag = get_object_or_404(Hashtag, pk=hash_pk)
    products = Article.objects.filter(hashtags=hashtag).order_by('-pk')
    context = {
        "hashtag": hashtag,
        "products": products,
    }
    return render(request, 'products/hashtag.html', context)
 
 
@login_required
def update(request, pk):
    product = get_object_or_404(Article, pk=pk)

    product.title = request.POST.get("title")
    product.content = request.POST.get("content")
    product.save()
   
    if request.method == "POST":
        form = CreatedForm(request.POST, request.FILES, instance=product)
        if form.is_valid():
            article = form.save(commit=False)
            article.author = request.user
            article.save()

            # 기존 해시태그를 지우고 새로 추가
            article.hashtags.clear()
            hashtags_input = form.cleaned_data.get('hashtags', '')
            hashtags = set(word for word in hashtags_input.split() if word.startswith('#'))
            for hashtag in hashtags:
                cleaned_hashtag = hashtag.strip("#")
                if cleaned_hashtag:
                    hashtag_obj, created = Hashtag.objects.get_or_create(content=cleaned_hashtag)
                    article.hashtags.add(hashtag_obj)
                   
            return redirect("products:product_detail", article.pk)
    else:
        form = CreatedForm(instance=product)
    context = {"form": form, "product": product}
    return render(request, "products/edit.html", context)
 
@login_required
def create(request):
    if request.method == "POST":
        form = CreatedForm(request.POST, request.FILES)
        if form.is_valid():
            article = form.save(commit=False)
            article.author = request.user
            article.save()

            # 해시태그 파싱 및 저장
            hashtags_input = form.cleaned_data.get('hashtags', '')
            hashtags = set(word for word in hashtags_input.split() if word.startswith('#'))
            for hashtag in hashtags:
                cleaned_hashtag = hashtag.strip("#")
                if cleaned_hashtag:
                    hashtag_obj, created = Hashtag.objects.get_or_create(content=cleaned_hashtag)
                    article.hashtags.add(hashtag_obj)
            article.save()
            return redirect("products:product_detail", article.pk)
    else:
        form = CreatedForm()
    context = {"form": form}
    return render(request, "products/create.html", context)
 

class Hashtag(models.Model):
    content = models.CharField(max_length=30, unique=True)
    # articles = models.ManyToManyField('Article', related_name='hashtag_articles')

    def __str__(self):
        return self.content


class Article(models.Model):
    title = models.CharField(max_length=20)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to="images/", blank=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="articles")
    like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="like_articles")
    hashtags = models.ManyToManyField(Hashtag, blank=True, related_name='article_hashtags')

    def __str__(self):
        return self.title