답변 등록 버튼 만들기
question_detail.html 일부 |
<form action="{{ url_for('answer.create', question_id=question.id) }}" method="post" >
<textarea name="content" id="content" rows="10"></textarea>
<input type="submit" value="답변등록">
</form>
|
answer별칭의 create의 라우팅함수의 url을 form태그의 action속성으로 지정.
"답변등록" 버튼누르면 POST방식으로 이 url이 호출(submit)될 것임. question_id라는 데이터도 함께.
[참고]GET vs POST ; 계속 햇갈리니까 정리하자 |
GET방식: db에 내용등록 절차 없이 해당 페이지 그냥 호출 POST방식: 내용 입력한다음에 db에 등록하고 새로운 페이지 호출 |
답변 블루프린트 만들기
answer_views.py 일부 |
@bp.route('/create/<int:question_id>', methods=('POST',))
def create(question_id):
question = Question.query.get_or_404(question_id)
content = request.form['content']
answer = Answer(content=content, create_date=datetime.now())
question.answer_set.append(answer)
db.session.commit()
return redirect(url_for('question.detail', question_id=question_id))
|
form엘리먼트가 POST방식이므로, @bp.route의 methods도 POST방식을 지정해줘야함. 안그러면 오류뜸.(Method Not Allowed)
request.form[데이터 name]
form엘리먼트를 통해 전달된 데이터들은 request객체로 얻을 수 있음
question.answer_set
question.answer_set 정의할때 칼럼이아니라 relationship으로 정의했었잖음.
answer set 그 자체에 접근하는거임. 따라서 question.answer_set에서 answer데이터를 추가,제거할 수 있음
근데 주의할 점이 이러한 방식(question.answer_set)으로 데이터 추가할때는 answer객체 생성할 때 question속성은 따로 정의를 안한 것을 볼 수 있음 answer = Answer(content=content, create_date=datetime.now()) .
어차피 question.answer_set.append하기 때문에, 즉 question정보가 명령어에 들어있기 때문에 question 속성을 추가하지 않는 듯.
블루 프린트 당연히 등록해야함.(교재 2-06)
답변 표시하기
question_detail.html 일부 |
<h5>{{ question.answer_set|length }}개의 답변이 있습니다.</h5>
<div>
<ul>
{% for answer in question.answer_set %} <li>{{ answer.content }}</li>
{% endfor %} <ul >
</div>
|
{{ question.answer_set|length}} : answer_set의 길이
length는 템플릿 내장 필터(html에서 내장되어 사용가능)로, 문자 뒤에 추가해서 사용함
'웹개발 > [점프 투 플라스크]' 카테고리의 다른 글
[점프 투 플라스크] 질문등록 & 폼모듈 (1) | 2024.04.10 |
---|---|
[점프 투 플라스크] 부트스트랩으로 화면 꾸미기 & 템플릿 상속 with 표준HTML (0) | 2024.04.10 |
[점프 투 플라스크] 질문 목록, 질문 상세 기능 만들기 및 블루프린트로 기능 분리하기 & url_for (0) | 2024.04.10 |
[점프 투 플라스크] 모델(ORM 클래스)로 데이터 처리하기. (0) | 2024.04.09 |
[점프 투 플라스크] 블루프린트 (0) | 2024.04.09 |