장고:답변쓰기(댓글쓰기)
장고! 웹 프레임워크! 틀:장고
개요
글에 답변을 다는 기능이다. 댓글기능을 추가하는 거라 보면 좋겠다.
url 작성
urls.py 안에 필요한 기능을 다 담아주어야 한다.(뷰의 설정이나, import방식에 따라 뷰를 불러오는 방식이 달라질 수 있다.)
일반적으로 코드를 짜는 경우 | 제네릭 뷰를 사용하는 경우 |
---|---|
다음과 같은 path를 추가해준다.
실제로 이동하는 링크는 아니지만, 기능을 구현하기 위한 것.from django.urls import path
from . views #해당 앱의 뷰를 불러온다.
app_name = 'pool'
urlpatterns = [
path('answer/create/<int:question_id>/', views.answer_create, name='answer_create'),
]
|
함수명을 바꾸어주어야 한다.
views.클래스뷰명.as_view()), 형태로. 클래스형 뷰임을 지정해주기 위해. |
#아직 함수를 짜주진 않았지만, 앞으로 만들 함수에 대해 연결해두자.
모델 작성
포함해야 할 것들이 있다. 작성자, 작성일자, 내용 등의 요소를 포함하여 모델을 작성한다. 이름은 answer로 하자.
/앱/models.py 안에 작성한다.
from django.contrib.auth.models import User
from django.db import models
class Answer(models.Model):#세부내용은 필요에 따라..
question = models.ForeignKey(Question, on_delete=models.CASCADE)
content = models.TextField()
create_date = models.DateTimeField()
관리자 기능에서 확인
모델이 제대로 작성되고, 글이 제대로 생성될 수 있는지 관리자기능에 등록한 후 answer를 작성해보자.
관리자 등록은 장고:관리자페이지 참조.
이상이 없으면 뷰 작성으로 넘어가자.
뷰, 탬플릿 작성
탬플릿과 연관이 깊으니, 같이 짜주자. 한 단계, 한 단계 차근차근 작동을 확인하며 넘어가자.
답변 작성하기
답변을 작성하는 기능의 view를 짜보자.
일반적으로 코드를 짤 경우 | 제네릭뷰(클래스형 뷰)를 쓰는 경우 | |
---|---|---|
template작성 | 작성은 화면에서 이루어지므로, 탬플릿을 먼저 작성한다.
글쓰기의 상세조회 탬플릿에 다음의 코드를 추가한다.<!--답변등록을 위한 것-->
<form action="{% url '앱이름:answer_create' question.id %}" method="post">
{% csrf_token %}
<textarea name="content" id="content" rows="15"></textarea>
<input type="submit" value="답변등록">
</form>
<!--답변을 보기 위한 것-->
<div>
<ul>
{% for answer in question.answer_set.all %}
<li>{{ answer.content }}</li>
{% endfor %}
</ul>
</div>
|
|
view 작성 | 작성 후에 다시 원 글로 이동이 필요하므로 redirect를 추가한다.from django.shortcuts import render, get_object_or_404, redirect
from .models import * #모델을 불러온다.
def answer_create(request, question_id):
question = get_object_or_404(Question, pk=question_id)
question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now())
return redirect('앱이름:detail', question_id=question.id)
from django.shortcuts import render, get_object_or_404, redirect
from .models import * #모델을 불러온다.
def answer_create(request, question_id):
question = get_object_or_404(Question, pk=question_id)
answer = Answer(question=question, content=request.POST.get('content'), create_date=timezone.now())
answer.save()
return redirect('앱이름:detail', question_id=question.id)
|