django 프로젝트를 하며 문제가 생겼다.
댓글 달기 기능인데
댓글을 달면 무조건 index로 설정해 놓았다.
근데 디테일 페이지를 추가하니
index에서 댓글을 달아도 index로가고 (원래 의도한바)
detail에서 댓글을 달아도 index로 가는 것이다. (안돼)
그래서 해결방법을 찾아보았다.
# 함수를 두개 만든다.
@login_required def c_post(request, post_id): if request.method =='POST': comment = get_object_or_404(Post, id=post_id) comment_text = request.POST.get('comment_text') comment_user = User.objects.get(username = request.user.get_username()) Comment.objects.create(comment=comment, comment_text=comment_text, comment_user=comment_user) return redirect(reverse('index'), post_id)
현재 댓글을 작성하는 함수는 c_post
index로 돌아간다.
똑같이 하나를 더 만든다.
c_post 2를 만들어 이 함수는 detail에서 호출할 때만 사용하게 하는 거다.
@login_required def c_post2(request, post_id): if request.method =='POST': comment = get_object_or_404(Post, id=post_id) comment_text = request.POST.get('comment_text') comment_user = User.objects.get(username = request.user.get_username()) Comment.objects.create(comment=comment, comment_text=comment_text, comment_user=comment_user) return redirect(reverse('detail'), post_id)
이런 식으로
하지만 c_post 2는 실행은 안 해봤다. 안 쓸 거니까..
이렇게 하면 너무 비효율적인 거 같다. 그리고 지저분해져
여기서 의문
그렇다면 현재 위치가 index에서는 index로 가고
detail에 서면 detail로가는 if문을 찾으면 되지 않을까?
그렇다면 현재 위치를 가져와야 한다.
# 현재 위치 가져오는 함수
request.path를 사용하면 url을 가져올 수 있다고 한다.
@login_required def c_post(request, post_id): print("aaaaa"+request.path) if request.method =='POST': comment = get_object_or_404(Post, id=post_id) comment_text = request.POST.get('comment_text') comment_user = User.objects.get(username = request.user.get_username()) Comment.objects.create(comment=comment, comment_text=comment_text, comment_user=comment_user) return redirect(reverse('index'), post_id)
뽑아보니 결과는
aaaaa/intworldapp/c_post/5
이다..
댓글을 쓸 때의 post_id를 url로 가져온다.
당연한 건가
내가 원하는 건 index의 url인데...
-----
좀 더 생각해봤다.
index로 올 때 url을 저장하면 되지 않나??
바로 ㄱㄱ
def index(request): posts = Post.objects.order_by('-id') app_url = request.path return render(request, 'index.html', {'posts':posts, 'app_url':app_url})
app_url로 아까 배운 url path를 저장한다.
<form action="{% url 'c_post' post.id %}" method="POST"> {% csrf_token %} <input type="text" name="comment_text" id="comment_text" placeholder="댓글달아주세요"> <input type="hidden" name="app_url" id="app_url" value="{{app_url}}"/> <button type="submit">댓글달기</button> </form>
그리고 form으로 댓글을 전송할 때 이 app_url값을 넘긴다면????
그렇다면?????
app_url은 index가 담겨있을 거고
전송할 때 그 app_url은 index를 넘긴다.
c_post를 실행할 때, app_url의 값이 index라면???
@login_required def c_post(request, post_id): if request.method =='POST': if request.POST.get('app_url') == '/intworldapp/index/': print("aaaaaaaaaaaaaaaaaaaa") else : print("bbbbbbbbbbbbbbbb") comment = get_object_or_404(Post, id=post_id) comment_text = request.POST.get('comment_text') comment_user = User.objects.get(username = request.user.get_username()) Comment.objects.create(comment=comment, comment_text=comment_text, comment_user=comment_user) return redirect(reverse('index'), post_id)
바로 테스트 ㄱㄱ
오예~
index에서 댓글 쓰니까 a 나오고
detail에서 글을 쓰니까 b가 나온다.
이걸 이용하면
@login_required def c_post(request, post_id): if request.method =='POST': comment = get_object_or_404(Post, id=post_id) comment_text = request.POST.get('comment_text') comment_user = User.objects.get(username = request.user.get_username()) Comment.objects.create(comment=comment, comment_text=comment_text, comment_user=comment_user) if request.POST.get('app_url') == '/intworldapp/index/': return redirect(reverse('index'), post_id) else : return redirect('detail', post_id)
아싸 성공~ 내가 원하는 대로 나왔다.
index에서 쓰면 index로
detail로가면 해당 detail로
이걸 이용해서 글 삭제랑 수정도 바꿀 수 있겠다.
'끄적끄적' 카테고리의 다른 글
django 2.0 버전부터 바뀐 url (0) | 2020.04.15 |
---|---|
다음에 할꺼 (0) | 2020.04.11 |
버튼 누를때 input값 추가, for문으로 데이터 받기 (0) | 2020.03.24 |
경력기술서 멤오 (0) | 2020.03.22 |
django 프로젝트 메모 (0) | 2020.03.22 |