3차 프로젝트 | 25.02.06 (목) 기록

Faithful Dev·2025년 2월 6일
0

Generated Prompt 저장 오류 수정

생성된 프롬프트가 어제 특정 작업 영역까지는 aigeneration DB에 저장되고 있었는데 언제부턴가 데이터베이스에 저장되지 않는 문제가 발생했다.

Post 모델 저장 로직 수정

@login_required
def create_post(request: HttpRequest) -> HttpResponse:
    if request.method == "POST":
        form = PostWithAIForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user

            generated_image_url = request.POST.get('generated_image_url')
            generated_prompt = request.POST.get('generated_prompt')  # 프롬프트 가져오기
            
            if generated_image_url:
                post.image = generated_image_url
            if generated_prompt:  # 프롬프트 저장
                post.generated_prompt = generated_prompt

            post.save()
            form.save_m2m()
            return redirect("index")

AIGeneration 모델 저장 로직 수정

@login_required
def generate_image(request):
    try:
        # ... 기존 코드 ...
        
        # AIGeneration 모델에 저장
        ai_generation = AIGeneration.objects.create(
            user=request.user,
            prompt=prompt,
            generated_prompt=generated_prompt,  # 생성된 프롬프트 저장
            image_url=blob_url
        )
        
        # 저장 확인용 로깅 추가
        logging.info(f"AIGeneration 저장 완료: id={ai_generation.id}, prompt={prompt}, generated_prompt={generated_prompt}")

        return JsonResponse({
            "image_url": blob_url,
            "generated_prompt": generated_prompt
        })

템플릿의 Hidden Input 처리

<div id="imagePreview" style="display: none;">
    <img id="generatedImage" src="" alt="">
    <input type="hidden" name="generated_image_url" id="generatedImageUrl">
    <input type="hidden" name="generated_prompt" id="generatedPrompt">
</div>

고려했던 내용

어제 Blob Storage 업로드 시점을 변경하면서 generated prompt가 POST DB 쪽으로 넘어갔었던 것.
어느 쪽으로 보내면 좋을지 고민했는데 일단은 두 모델에 모두 저장하기로 했다.

  • Post: 게시물과 함께 프롬프트 정보 유지
  • AIGeneration: AI 생성 기록 추적 및 히스토리 관리

갤러리 시스템 구현: 개인/공개 갤러리 분리

이제까지는 모든 갤러리가 @login_required의 개인 갤러리로만 운영되고 있었다.

목표

  • 사용자별 개인/갤러리 제공
  • 공개/비공개 설정 가능한 공유 갤러리
  • 로그인한 사용자만 접근 가능한 개인 갤러리
  • 모든 사용자가 접근 가능한 공개 갤러리

Post 모델

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(auto_now_add=True)
    image = models.URLField(blank=True, null=True, max_length=1000)
    generated_prompt = models.TextField(blank=True, null=True)
    is_public = models.BooleanField(default=False)  # 추가된 필드

@login_required
def my_gallery(request):
    """사용자의 개인 갤러리"""
    posts = Post.objects.filter(user=request.user).order_by('-date_posted')
    return render(request, "app/gallery.html", {
        "posts": posts,
        "gallery_type": "personal"
    })

def public_gallery(request):
    """공개 갤러리"""
    posts = Post.objects.filter(is_public=True).order_by('-date_posted')
    return render(request, "app/gallery.html", {
        "posts": posts,
        "gallery_type": "public"
    })

URL 패턴

urlpatterns = [
    # ... 기존 URL 패턴들 ...
    path("gallery/my/", views.my_gallery, name="my_gallery"),
    path("gallery/public/", views.public_gallery, name="public_gallery"),
]

class PostWithAIForm(forms.ModelForm):
    prompt = forms.CharField(
        widget=forms.Textarea,
        required=False,
        help_text='AI 이미지 생성을 위한 프롬프트'
    )
    is_public = forms.BooleanField(
        required=False,
        initial=False,
        help_text='공개 갤러리에 공유하기'
    )

    class Meta:
        model = Post
        fields = ["title", "content", "is_public"]

네비게이션 바 (base.html)

<nav class="navbar navbar-expand-lg navbar-light bg-light mb-4">
    <div class="container">
        <div class="navbar-nav">
            <a class="nav-link" href="{% url 'index' %}"></a>
            {% if user.is_authenticated %}
                <a class="nav-link" href="{% url 'my_gallery' %}">내 갤러리</a>
            {% endif %}
            <a class="nav-link" href="{% url 'public_gallery' %}">공개 갤러리</a>
            {% if user.is_authenticated %}
                <a class="nav-link" href="{% url 'create_post' %}">새 글 작성</a>
            {% endif %}
        </div>
    </div>
</nav>

구현 내용

  1. Post 모델에 is_pubic 필드 추가로 공개/비공개 설정 가능
  2. 개인 갤러리는 로그인 필수(@login_required)
  3. 공개 갤러리는 누구나 접근 가능
  4. 게시물 작성 시 공개 여부 선택 가능

게시물 제목 검색 기능 구현

공개 갤러리까지 만들었으니 게시물을 검색할 수 있는 기능이 있으면 좋겠다 싶었다.
공개 갤러리와 개인 갤러리 모두에서 사용할 수 있는 검색 기능으로 작업했다.

views.py

def public_gallery(request):
    """공개 갤러리"""
    search_query = request.GET.get('search', '')
    posts = Post.objects.filter(is_public=True)
    
    if search_query:
        posts = posts.filter(title__icontains=search_query)
    
    posts = posts.order_by('-date_posted')
    return render(request, "app/gallery.html", {
        "posts": posts,
        "gallery_type": "public",
        "search_query": search_query
    })
  • request.GET.get('search', ''): URL 쿼리 파라미터에서 검색어를 가져옴
  • title__icontains: 대소문자를 구분하지 않고 제목에 검색어가 포함된 게시물 필터링
  • 검색어를 템플릿으로 다시 전달하여 검색창에 유지
profile
Turning Vision into Reality.

0개의 댓글