장고:답변쓰기(댓글쓰기): 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
잔글 (Sam님이 장고:답변쓰기 문서를 장고:답변쓰기(댓글쓰기) 문서로 이동했습니다) |
(→개요) |
||
5번째 줄: | 5번째 줄: | ||
=url 작성= | =url 작성= | ||
urls.py 안에 필요한 기능을 다 담아주어야 한다. | urls.py 안에 필요한 기능을 다 담아주어야 한다.(뷰의 설정이나, import방식에 따라 뷰를 불러오는 방식이 달라질 수 있다.) | ||
(뷰의 설정이나, import방식에 따라 뷰를 불러오는 방식이 달라질 수 있다.) | |||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+ | ||
15번째 줄: | 11번째 줄: | ||
!제네릭 뷰를 사용하는 경우 | !제네릭 뷰를 사용하는 경우 | ||
|- | |- | ||
|<syntaxhighlight lang="python"> | |다음과 같은 path를 추가해준다. | ||
실제로 이동하는 링크는 아니지만, 기능을 구현하기 위한 것.<syntaxhighlight lang="python"> | |||
from django.urls import path | from django.urls import path | ||
from . views #해당 앱의 뷰를 불러온다. | from . views #해당 앱의 뷰를 불러온다. | ||
22번째 줄: | 20번째 줄: | ||
urlpatterns = [ | urlpatterns = [ | ||
path(' | path('answer/create/<int:question_id>/', views.answer_create, name='answer_create'), | ||
] | ] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
37번째 줄: | 31번째 줄: | ||
=모델 작성= | =모델 작성= | ||
포함해야 할 것들이 있다. 작성자, 작성일자, 내용 등의 요소를 포함하여 모델을 작성한다. 이름은 answer로 하자. | |||
/앱/models.py 안에 작성한다.<syntaxhighlight lang="python"> | /앱/models.py 안에 작성한다.<syntaxhighlight lang="python"> | ||
43번째 줄: | 37번째 줄: | ||
from django.db import models | from django.db import models | ||
class | class Answer(models.Model):#세부내용은 필요에 따라.. | ||
question = models.ForeignKey(Question, on_delete=models.CASCADE) | |||
content = models.TextField() | content = models.TextField() | ||
create_date = models.DateTimeField() | create_date = models.DateTimeField() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===관리자 기능에서 확인=== | ===관리자 기능에서 확인=== | ||
모델이 제대로 작성되고, 글이 제대로 생성될 수 있는지 관리자기능에 등록한 후 작성해보자. | 모델이 제대로 작성되고, 글이 제대로 생성될 수 있는지 관리자기능에 등록한 후 answer를 작성해보자. | ||
관리자 등록은 [[장고:관리자페이지]] 참조. | 관리자 등록은 [[장고:관리자페이지]] 참조. | ||
61번째 줄: | 50번째 줄: | ||
이상이 없으면 뷰 작성으로 넘어가자. | 이상이 없으면 뷰 작성으로 넘어가자. | ||
=뷰 작성= | =뷰, 탬플릿 작성= | ||
탬플릿과 연관이 깊으니, 같이 짜주자. 한 단계, 한 단계 차근차근 작동을 확인하며 넘어가자. | |||
== | ==답변 작성하기== | ||
답변을 작성하는 기능의 view를 짜보자. | |||
{| class="wikitable" | {| class="wikitable" | ||
! | ! | ||
69번째 줄: | 60번째 줄: | ||
!제네릭뷰(클래스형 뷰)를 쓰는 경우 | !제네릭뷰(클래스형 뷰)를 쓰는 경우 | ||
|- | |- | ||
| | |template작성 | ||
| | |작성은 화면에서 이루어지므로, 탬플릿을 먼저 작성한다. | ||
글쓰기의 상세조회 탬플릿에 다음의 코드를 추가한다.<syntaxhighlight lang="html"> | |||
<!--답변등록을 위한 것--> | |||
<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> | <ul> | ||
{% for answer in question.answer_set.all %} | |||
<li | <li>{{ answer.content }}</li> | ||
{% endfor %} | |||
</ul> | </ul> | ||
</div> | |||
</syntaxhighlight>글 detail 뷰에서 question객체를 탬플릿에 보냈는데, question 객체 안에 연결된 answer객체가 함께 담겨 딸려간다. | |||
</ | | | ||
</syntaxhighlight>탬플릿에 | |||
|- | |- | ||
|view 작성 | |view 작성 | ||
| | |작성 후에 다시 원 글로 이동이 필요하므로 redirect를 추가한다.<syntaxhighlight lang="python"> | ||
from django.shortcuts import render, get_object_or_404, redirect | |||
from django.shortcuts import render, get_object_or_404 | |||
from .models import * #모델을 불러온다. | from .models import * #모델을 불러온다. | ||
def | def answer_create(request, question_id): | ||
question=get_object_or_404(Question, pk=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) | |||
</syntaxhighlight>question.answer_set은 question에 대한 모델임을 의미한다. foreign 키로 연결되어 있어 이처럼 사용 가능하다. | |||
혹은 answer객체를 직접 불러와 내용을 저장할 수도 있다.<syntaxhighlight lang="python"> | |||
from django.shortcuts import render, get_object_or_404, redirect | from django.shortcuts import render, get_object_or_404, redirect | ||
from | from .models import * #모델을 불러온다. | ||
def answer_create(request, question_id): | |||
def | 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) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
| | | | ||
|}<br /> | |||
|} | |||
<br /> |
2020년 10월 31일 (토) 21:35 판
장고! 웹 프레임워크! 틀:장고
개요
글에 답변을 다는 기능이다. 댓글기능을 추가하는 거라 보면 좋겠다.
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)
|