27. 글 수정 처리 - eungyukm/DjangoBase GitHub Wiki

글 수정 처리

  1. 글 수정
<a href="/board/board_main?board_info_idx={{board_info_idx}}&content_idx={{content_idx}}&page_num={{page_num}}" class="btn btn-primary">목록보기</a>
<a href="/board/board_modify?board_info_idx={{board_info_idx}}&content_idx={{content_idx}}&page_num={{page_num}}" class="btn btn-info">수정하기</a>
<a href="/board/board_delete?board_info_idx={{board_info_idx}}&content_idx={{content_idx}}&page_num={{page_num}}" class="btn btn-danger">삭제하기</a>
def board_modify(request) :
    # 파라미터 데이터를 추출합니다.
    board_info_idx = request.GET['board_info_idx']
    content_idx = request.GET['content_idx']
    page_num = request.GET['page_num']

    # 현재 글 정보를 가져옵니다.
    content_model = board_app.models.ContentTable.objects
    content_model = content_model.select_related('content_writer_idx', 'content_board_idx')
    content_model = content_model.get(content_idx=content_idx)

    template = loader.get_template('board_modify.html')
    render_data = {
        'board_info_idx' : board_info_idx,
        'content_idx' : content_idx,
        'page_num' : page_num,
        'content_model' : content_model,
    }
    return HttpResponse(template.render(render_data, request))
  1. 데이터 읽어오기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>미니 프로젝트</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>

{% include 'top_menu.html' %}

<div class="container" style="margin-top:100px">
	<div class="row">
		<div class="col-sm-3"></div>
		<div class="col-sm-6">
			<div class="card shadow">
				<div class="card-body">
					<form action="board_modify.html" method="post">
						<div class="form-group">
							<label for="board_writer_name">작성자</label>
							<input type="text" id="board_writer_name" name="board_writer_name" class="form-control" value="{{content_model.content_writer_idx.user_name}}" disabled="disabled"/>
						</div>
						<div class="form-group">
							<label for="board_date">작성날짜</label>
							<input type="text" id="board_date" name="board_date" class="form-control" value="{{content_model.content_date|date:'Y-m-d'}}" disabled="disabled"/>
						</div>
						<div class="form-group">
							<label for="board_subject">제목</label>
							<input type="text" id="board_subject" name="board_subject" class="form-control" value="{{content_model.content_subject}}"/>
						</div>
						<div class="form-group">
							<label for="board_content">내용</label>
							<textarea id="board_content" name="board_content" class="form-control" rows="10" style="resize:none">{{content_model.content_text}}</textarea>
						</div>
						<div class="form-group">
							<label for="board_file">첨부 이미지</label>
							{% if content_model.content_file %}
							<img src="{{content_model.content_file.url}}" width="100%"/>	
							{% endif %}
							<input type="file" name="board_file" id="board_file" class="form-control" accept="image/*"/>					
						</div>
						<div class="form-group">
							<div class="text-right">
								<button type="submit" class="btn btn-primary">수정완료</button>
								<a href="board_read.html" class="btn btn-info">취소</a>
							</div>
						</div>
					</form>
				</div>
			</div>
		</div>
		<div class="col-sm-3"></div>
	</div>
</div>

{% include 'bottom_info.html' %}
</body>
</html>
  1. 글 수정에서 취소 버튼
<a href="/board/board_read?board_info_idx={{board_info_idx}}&content_idx={{content_idx}}&page_num={{page_num}}" class="btn btn-info">취소</a>
  1. 수정 완료 처리
  • 글 쓰는 페이지 처리와 비슷합니다.
  • board_app/templates/board_modify의 form 태그의 action을 /board/board_modify_result로 세팅합니다.
  • csrf 토큰도 설정합니다.
<form action="/board/board_modify_result" method="post" enctype="multipart/form-data">
{% csrf_token %}
  1. board_app/urls.py에 board_modify_result 주소를 등록합니다.
from django.urls import path
from . import views
from django.urls import include

urlpatterns = [
    path('board_main', views.board_main, name='board_main'),
    path('board_modify', views.board_modify, name='board_modify'),
    path('board_read', views.board_read, name='board_read'),
    path('board_write', views.board_write, name='board_write'),
    path('board_write_result', views.board_write_result, name='board_write_result'),
    path('board_modify_result', views.board_modify_result, name='board_modify_result'),
]
  1. board_app/views.py 에 board_modify_result 함수를 만들고 수정처리를 합니다.
  • views.py에서 처리하기 위해 필요 데이터를 넘깁니다.
<input type="hidden" name="board_info_idx" value="{{board_info_idx}}"/>
<input type="hidden" name="content_idx" value="{{content_idx}}"/>
<input type="hidden" name="page_num" value="{{page_num}}"/>
@csrf_exempt
def board_modify_result(request) :

    # 파라메터 추출
    board_info_idx = request.POST['board_info_idx']
    print("board_info_idx" + board_info_idx)
    content_idx = request.POST['content_idx']
    content_subject = request.POST['board_subject']
    content_text = request.POST['board_content']
    page_num = request.POST['page_num']

    content_file = request.FILES.get('board_file')

    # 수정하고자 하는 글 정보를 가져옵니다.
    content_model = board_app.models.ContentTable.objects.get(content_idx=content_idx)

    # 정보를 세팅합니다.
    content_model.content_subject = content_subject
    content_model.content_text = content_text

    if content_file :
        content_model.content_file = content_file

    # 저장합니다.
    content_model.save()

    message = f'''
                <script>
                    alert('수정되었습니다')
                    location.href = '/board/board_modify?board_info_idx={board_info_idx}&page_num={page_num}&content_idx={content_idx}'
                </script>
            '''

    return HttpResponse(message)
⚠️ **GitHub.com Fallback** ⚠️