Django 프로젝트 4주차 - 리뷰 수정 및 삭제

Red_Panda·2021년 8월 23일
0

Python & Django

목록 보기
7/7
post-thumbnail

리뷰 수정 및 삭제는 레시피 수정 및 삭제와 똑같다.

리뷰 글 밑에 현재 유저와 review를 삭정한 유저가 같으면 보이는 수정 및 삭제버튼을 넣어준다.

수정 및 삭제 기능을 넣는김에 작성자, 작성시간을 추가하고 색깔, 배치를 통해 리뷰 부분을 좀 더 보기 좋게 다듬었다.

recipe_detail.html

<h4 class="border-bottom my-4 py-2">{{ recipe.review_set.count }}개의 평가</h4>
    {% for review in recipe.review_set.all %}
        <div class="card my-3">
            <div class="card-body">
                ☆ : {{ review.score }}
                <span class="card-text" style="white-space: pre-line;">
                    {{ review.content}}
                </span>
                <div class="d-flex justify-content-end">
                    <div class="badge badge-pill badge-light" style="font-size:15px; margin-bottom:10px">작성자 : {{ review.writer.username }} </div>
                </div>
                <div class="d-flex justify-content-end" >
                    <div class="badge badge-pill badge-info" style="font-size:15px">{{ review.create_date }}</div>
                </div>
            </div>
        </div>
        {% if request.user == review.writer %}
                <div class="row justify-content-end">
                    <a href="{% url 'naengpa:review_modify' review.id  %}"
                        class="btn btn-sm btn-outline-secondary" style="width:70px; height:30px; margin-right:20px; " >수정</a>
                    <a href="#" class="delete btn btn-sm btn-outline-secondary" style="width : 70px; height:30px; margin-right:20px;"
                    data-uri="{% url 'naengpa:review_delete' review.id %}">삭제</a>
                </div>
        {% endif %}
    {% endfor %}
        

그러면 아래처럼 보인다. 미적감각이 없긴하다 ㅋㅋ.

그리고 아래와 같이 urls.py에 수정, 삭제 기능을 담당할 함수를 매핑하자.

다음으로, 위에 매핑한 함수들을 views.py에 만든다.

views.py

@login_required(login_url='common:login')
def review_modify(request, review_id): # 리뷰 수정
    review = get_object_or_404(Review, pk=review_id)
    print("aaaaaaaa",review, review_id)
    if request.user != review.writer:
        messages.error(request, '수정권한이 없습니다.')
        return redirect('naengpa:detail',review_id = review.recipe.id)

    if request.method == "POST": # 수정완료 버튼
        form = ReviewForm(request.POST, instance=review)
        if form.is_valid():
            review = form.save(commit=False)
            review.modify_date = timezone.now()
            review.save()
            return redirect('naengpa:detail', recipe_id = review.recipe.id) # 수정완료시 해당 글 detail로

    else: # method == GET
        form = ReviewForm(instance=review) # 해당글의 원래 정보도 같이 불러온다.

    context = {'review':review, 'form': form}
    return render(request, 'naengpa/review_form.html',context)


@login_required(login_url='common:login')
def review_delete(request, review_id): # 리뷰 삭제
    review = get_object_or_404(Review, pk=review_id)
    if request.user != review.writer:
        messages(request, "삭제권한 없음")

    review.delete()
    return redirect('naengpa:detail', recipe_id = review.recipe.id)

마지막으로, 답변 수정시 불러올 review_form을 만든다.

{% extends 'base.html' %}
{% block content %}
<div class="container my-3">
    <form method="post" class="post-form">
            {% csrf_token %}
            {% include "error_form.html" %}
            <div class="form-group">
            <textarea name="content" id="content" class="form-control" rows="10">{{ form.content.value|default_if_none:' '}}</textarea><br>
            레시피 점수 ☆ :
            {% if form.score.value %}
                {% if form.score.value == 1 %}
                <select name="score">
                    <option value=1 selected>1</option>
                    <option value=2>2</option>
                    <option value=3>3</option>
                    <option value=4>4</option>
                    <option value=5>5</option>
                {% elif form.score.value == 2 %}
                <select name="score">
                    <option value=1>1</option>
                    <option value=2 selected>2</option>
                    <option value=3>3</option>
                    <option value=4>4</option>
                    <option value=5>5</option>
                </select>
                {% elif form.score.value == 3 %}
                <select name="score">
                    <option value=1>1</option>
                    <option value=2>2</option>
                    <option value=3 selected>3</option>
                    <option value=4>4</option>
                    <option value=5>5</option>
                </select>
                {% elif form.score.value == 4 %}
                <select name="score">
                    <option value=1>1</option>
                    <option value=2>2</option>
                    <option value=3>3</option>
                    <option value=4 selected>4</option>
                    <option value=5>5</option>
                </select>
                {% elif form.score.value == 5 %}
                <select name="score">
                    <option value=1>1</option>
                    <option value=2>2</option>
                    <option value=3>3</option>
                    <option value=4>4</option>
                    <option value=5 selected>5</option>
                </select>
                {% endif %}
            {% endif %}
            </div>
        <input type="submit" value="수정하기">
    </form>
</div>

{% endblock %}

기존 값을 그대로 가지고 있어야하기때문에 가져온 score 값에 따라 selected를 정해줬다. 반복적인 코드로 너무 길어져서 보기 좋지 않지만..

로그인 후, 자신이 작성한 리뷰에만 수정, 삭제 버튼이보인다.
그리고 수정 버튼을 누르면 위에서 만든 review_form.html을 불러오면서 기존에 작성된 내용 및 점수를 그대로 가져온다.
수정 하기 버튼을 누르면 바뀐내용이 잘 저장된 것을 확인할 수 있다.

끝.


검색 부분은 아직도 고민중인데 오랫동안 명쾌한 답이 나오지 않으면 완벽하지 않아도 최대한 유용하게 만드는 방향으로 가볼까 싶다.

그리고 앞으로 프로젝트는 천천히 진행할 것이다. 다른 공부할 것들이 넘쳐난다 흑흑

profile
신입 개발자

0개의 댓글