본문 바로가기

학습/[The-Origin][SW][Backend] Main Pag

[The Origin][VSCODE][Django][CRUD] Update

반응형

수정 Update

※ update = create + detail

    생성하는 화면 + 상세 Data 수정


수정하기(create)

버튼 만들고 연결하기

  - 수정하기 url 연결을 위한 name 지정

  - post_card에 수정하기 글씨 버튼 만들기

수정하기 화면 이동 

  - 수정하기 화면(입력 화면)으로 이동 기능

  - post_form.html

수정하기 화면 내용 추가

  - Load 됐을 때 화면에 기존에 있었던 사진, 내용 추가

{% extends 'base.html' %}

{% block title %}글 입력{% endblock %}

{% block content %}
<h1>Post 입력 화면</h1>
<form action="" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div>
        <label for="">이미지</label>
        {% if post.image %}
        <p> 현재 : <a href="{{ post.image.url }}">{{ post.image.name }}</a></p>
        <p> 변경 : <input type="file" name="image" accept="image/*" id="id_image"></p>
        {% else %}
        <input type="file" name="image" accept="image/*" id="id_image">
        {% endif %}
    </div>
    <div>
        <label for="id_content">내용</label>
        <textarea name="content" id="id_content" cos="30" rows="10">{% if post %}{{ post.content }}{% endif %}</textarea>
    </div>
    <div>
        <input type="submit">
    </div>
</form>
{% endblock %}

      {% if post %}{{ post.content }}{% endif %}

         : content가 있을때 내용을 내용에 넣어주기

      {% if post.image %}
        <p> 현재 : <a href="{{ post.image.url }}">{{ post.image.name }}</a></p>
        <p> 변경 : <input type="file" name="image" accept="image/*" id="id_image"></p>

         : 현재에는 어떤 것이고 새로운 것은 어떤 것인지 표시,

      {% else %}
        <input type="file" name="image" accept="image/*" id="id_image">
      {% endif %}

          : 이미지 없을때에는 그냥 이미지 추가하기 버튼

 

  ※ post-create url은 없어야함

     수정시 create가 한번 더 발생하기 때문에 삭제를하지 않으면 중복으로 데이터가 Upload됨

     (수정한것 1회, 수정한것으로 새로만들어서 1회)


수정하기(detail)

수정하기 기능 추가

  - views.py의 update에 추가하는 Data code 추가

  - 특이사항 발생

     똑같은 사진을 수정을 해도 이름이 바뀌어서 추가가 계속됨

 

수정하기 기능 특이사항 대응

  - 기존에 있던 파일은 삭제하고 새로운 파일로 저장하는 기능

def post_update_view(request, id):
    Post = post.objects.get(id=id)
    if request.method == 'GET':
        context = {'post' : Post }
        return render(request, 'posts/post_form.html', context)
    elif request.method == 'POST':
        new_image = request.FILES.get('image')
        content = request.POST.get('content')
        print(new_image)
        print(content)
        if new_image:
            Post.image.delete()
            Post.image = new_image

        Post.content = content
        Post.save()

        return redirect('posts:post-detail', Post.id)

Tip

id가 다를 때의 Error 처리

  - Post = get_list_or_404(post, id=id, writer=request.user)

     id가 다를때 404 Page없음을 일으킨다.

from django.shortcuts import redirect, render, get_list_or_404

def post_update_view(request, id):
    #Post = post.objects.get(id=id)
    Post = get_list_or_404(post, id=id, writer=request.user)
    if request.method == 'GET':
        context = {'post' : Post }
        return render(request, 'posts/post_form.html', context)
    elif request.method == 'POST':
        new_image = request.FILES.get('image')
        content = request.POST.get('content')
        print(new_image)
        print(content)
        if new_image:
            Post.image.delete()
            Post.image = new_image

        Post.content = content
        Post.save()

        return redirect('posts:post-detail', Post.id)

def post_delete_view(request, id):
    return render(request, 'posts/post_confirm_delete.html')
 
반응형