장고:글쓰기
편집하기
180.81.64.102
(
토론
)
님의 2021년 6월 25일 (금) 13:16 판
(
→url 작성
)
(
차이
)
← 이전 판
|
최신판
(
차이
) |
다음 판 →
(
차이
)
둘러보기로 이동
검색으로 이동
경고: 이 문서의 오래된 판을 편집하고 있습니다.
이것을 게시하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
{{장고}} =글 보기= 리스트에서 글을 클릭하면 글의 상세내용을 볼 수 있어야 한다. {| class="wikitable" ! !일반적으로 코드를 짤 경우 !제네릭뷰(클래스형 뷰)를 쓰는 경우 |- |view 작성 |글 하나의 내용을 본다. get_object_or_404를 쓴다. id에 해당하는 객체가 없으면 서버에서 에러를 일으키는데, 이는 서버에러로 잡힌다. 에러의 방향성을 명확히 지정해주기 위해. 404에러를 부르게끔!<syntaxhighlight lang="python"> from django.shortcuts import render, get_object_or_404 from .models import * #모델을 불러온다. def detail(request,question_id):#url에서 매핑된 question_id가 전달된다. question=get_object_or_404(Question, pk=question_id) context={'question':question} return render(request, 'detail.html', context) </syntaxhighlight> |<syntaxhighlight lang="python"> from django.views import generic class DetailView(generic.DetailView): model = Question #템플릿 명이 명시적으로 지정되지 않은 경우에는 자동으로 모델명_detail.html을 템플릿명으로 사용 </syntaxhighlight>urls.py에서 기입할 때 .as_view를 붙여야 함에 유의하고, 제네릭뷰에 경우, 변수명이 지정되어 있다. urls.py에서 <int:pk> 형태로 기입받는다. |- |template작성 |경로에 맞게 해주면 되는데, 위 뷰의 경우엔 /앱이름/template/detail.html 에 만들어준다. 만들어진 html파일의 body에 다음과 같이 넣어준다. 상황에 맞게 표를 만들든, 목차를 만들든 html을 짜면 될 터. <nowiki>{{변수.속성}}</nowiki> 형태로 필요한 데이터를 가져온다.<syntaxhighlight lang="html"> <h1>{{ question.subject }}</h1> <div> {{ question.content }} </div> </syntaxhighlight> |제네릭 뷰를 쓸 땐 탬플릿에 모델이 object라는 이름으로 전달된다. <code><nowiki>{{object.subject}}</nowiki></code> 형태의 이름을 써서 변수를 사용할 수 있다. |} ==글 작성(폼에러 띄우기)== ===form.as_p 태그 조작하기=== 자동으로 태그로 감싸주기 때문에 탬플릿에서 편집이 안된다. 이렇게 되면 디자인측면에서 제약이 생기게 되는데.. 개개 입력칸을 편집하기 위해선 form의 수정이 필요하다.<syntaxhighlight lang="python"> class QuestionForm(forms.ModelForm):#모델폼 상속 class Meta: widgets = { #이 속성의 추가로 입력항목에 부트스트랩의 클래스를 추가해 넣을 수 있다. 'subject': forms.TextInput(attrs={'class': 'form-control'}), 'content': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}), } </syntaxhighlight>그런데, 위처럼 작업하면 디자이너가 .py를 만져야 한다는 점에서 디자이너와 개발자간 역할분리가 흐려지기도 한다는 단점이 있다. 이를 탬플릿에서 직접 다루기 위해선 다시 widgets 속성을 없애고, 탬플릿을 수정해준다. 다음과 같은 형식으로 폼 내부의 속성에 접근할 수 있고, 이들을 html에서 직접 편집할 수 있다.<syntaxhighlight lang="html"> <label for="subject">제목</label> <input type="text" class="form-control" name="subject" id="subject" value="{{ form.subject.value|default_if_none:'' }}"> </syntaxhighlight><nowiki>{{form.subject}}</nowiki>로 접근할 수 있지만, <nowiki>{{form.subject.value}}</nowiki>를 써준 것은, 에러가 나고 페이지를 새로 불러들일 때 기존 입력값을 보존하기 위함이다. <nowiki>|</nowiki>default_if_none:<nowiki>''</nowiki> 은 값을 쓰지 않았을 때 <nowiki>''</nowiki>를 담아주기 위한 것. 초기값을 지정할 수도 있다.(이걸 지정하지 않으면 입력하지 않은 값들에 'none'이라는 문자열이 담겨 꼴이 우스워진다) <br /> ==글 수정== {| class="wikitable" ! !일반적으로 코드를 짤 경우 !제네릭뷰(클래스형 뷰)를 쓰는 경우 |- |template작성 | colspan="2" |위에서 만든 detail.html을 수정한다. 글 수정을 위한 링크를 추가.<syntaxhighlight lang="html"> {% if request.user == question.author %}<!--해당 작성자 일때만 수정버튼이 보이게끔!--> <a href="{% url '앱이름:modify' question.id%}" class="btn btn-primary">수정</a> {% endif %} </syntaxhighlight>제네릭 뷰를 쓰는 경우 넘겨주는 변수에 <code>pk=question.id</code> 형태로 넣어주어야 한다. |- |view 작성 |글 작성과 동일하게 get처리와 post 처리를 한 함수에서 다룬다.<syntaxhighlight lang="python"> from .forms import QuestionForm#위에서 작성한 폼 불러오기 from .models import Question #모델을 불러온다. from django.contrib import messages#넌필드 오류를 반환하기 위한 것 def modify(request, question_id):#이름을 update로 해도 괜찮았을 듯하다. question = get_object_or_404(Question, pk=question_id) if request.user != question.author: messages.error(request, '수정권한이 없습니다') return redirect('앱이름:detail', question_id=question.id) if request.method == "POST": form = QuestionForm(request.POST, instance=question)#받은 내용을 객체에 담는다. if form.is_valid(): question = form.save(commit=False) question.author = request.user question.modify_date = timezone.now() # 수정일시 자동 저장 question.save() return redirect('앱이름:detail', question_id=question.id) else:#GET으로 요청된 경우. form = QuestionForm(instance=question)#해당 모델의 내용을 가져온다! context = {'form': form} return render(request, 'create.html', context) </syntaxhighlight>messages.error 가 있으면 넌필드 오류를 반환한다. |<syntaxhighlight lang="python"> from django.views import generic from django.urls import reverse_lazy class update(generic.UpdateView): model = Question feilds = ['필드명', '필드명',...]#작성할 필드명 지정 success_url=reverse_lazy('앱이름:detail')#작성에 성공한 경우 보낼 탬플릿. template_name_suffix='_update' #사용하는 탬플릿 명을 '모델명_create.html'로 바꾼다는 의미. 접미사만 바꾼다. #기본 탬플릿은 '모델명_form.html'로 나타난다. def form_valid(self, form): # 폼에 이상이 없으면 실행. temp = form.save(commit=False) # 임시 저장. 폼 외의 다른 내용을 조작하고 싶을 때 사용한다. 조작 temp.save() # 최종 저장 return super().form_valid(form) </syntaxhighlight> |- |template작성 | colspan="2" |글 작성과 동일한 탬플릿을 사용한다. 생성칸에 기존의 데이터만 form에 담아서 보내면 되니까!<syntaxhighlight lang="html"> {% extends '연장할탬플릿.html' %} {% block content %} <form method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" value='나타낼 텍스트'> </form> {% endblock %} </syntaxhighlight> |} ==글 삭제(+에러메시지 띄우기)== {| class="wikitable" ! !일반적으로 코드를 짤 경우 !제네릭뷰(클래스형 뷰)를 쓰는 경우 |- |template작성 +JQuery | colspan="2" |위에서 만든 detail.html을 수정한다. 글 수정을 위한 링크를 추가. 글 수정과 동일하게, 편집자만 접근할 수 있게끔 if 태그 안에 넣어준다.<syntaxhighlight lang="html"> <a href="{% url '앱이름:delete' question.id%}" class="btn btn-primary">삭제</a> </syntaxhighlight>제네릭 뷰를 쓰는 경우, 넘겨주는 변수에 <code>pk=question.id</code> 형태로 넣어주어야 한다. 이번엔 특수한 기능을 위해 JQuery도 함께 작성한다. 에러 메시지를 띄우기 위한 확인창을 구현하기 위해서. 기존의 작성법과 조금 다르다. 다음과 같이 수정해주자.<syntaxhighlight lang="html"> <a href="#" data-uri="{% url '앱이름:delete' question.id %}" class="delete">삭제</a> <!-- data-uri 속성은 jQuery에서 $(this).data('uri') 형태로 받아가기 위해서 작성--> <script type='text/javascript'> $(document).ready(function(){ $(".delete").on('click', function() { //delete를 포함하는 클래스가 있으면 작동한다. if(confirm("님, 정말로 지움??")) { location.href = $(this).data('uri'); } }); }); </script> <!-- 취소를 누르면 아무 일도 하지 않는다.--> </syntaxhighlight>JQuery가 포함되어있지 않으면 사용할 수 없다. |- |view 작성 |<syntaxhighlight lang="python"> from .models import Question #모델을 불러온다. @login_required(login_url='membership:login') def delete(request, question_id): question = get_object_or_404(Question, pk=question_id) if request.user != question.author: messages.error(request, '삭제권한이 없습니다') return redirect('앱이름:detail', question_id=question.id) question.delete() return redirect('앱이름:index') </syntaxhighlight> |<syntaxhighlight lang="python"> from django.views import generic from django.urls import reverse_lazy class create(generic.DeleteView): model = Question success_url=reverse_lazy('앱이름:list')#작성에 성공한 경우 보낼 탬플릿. template_name_suffix='_delete' #사용하는 탬플릿 명을 '모델명_delete.html'로 바꾼다는 의미. 접미사만 바꾼다. #기본 탬플릿은 '모델명_confirm_delete.html'로 나타난다. </syntaxhighlight> |- |template작성 |글 삭제 확인페이지.(JQuery를 이용한 경우엔 해당사항 없음.) 글 작성에서 사용한 탬플릿에서 버튼 이름만 바꾼다. (post요청을 통해 들어온 경우에만 삭제하게끔 view 변형 필요.)<syntaxhighlight lang="html"> {% extends '연장할탬플릿.html' %} {% block content %} <form method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" value='나타낼 텍스트'> </form> {% endblock %} </syntaxhighlight> |글 삭제 확인페이지로 이동한다.(JQuery를 이용한 경우엔 해당사항 없음.)<syntaxhighlight lang="html"> {% extends '연장할탬플릿.html' %} {% block content%} <form action="" method='post'> {% csrf_token %} <div class="alert alert-danget">나타낼텍스트 {{나타낼변수}} 자유롭게 사용.</div> <input type="submit" value="Delete" class="btn btn-danget" </form> {% endblock %} </syntaxhighlight> |} ==tip== 뷰가 많아지면 /앱/views/posting_view.py 따위의 이름으로 뷰를 나누어 작성하는 것도 전략이다.
요약:
학교의 모든 지식. SMwiki에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
학교의 모든 지식. SMwiki:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
이 문서에서 사용한 틀:
틀:장고
(
원본 보기
) (보호됨)
둘러보기 메뉴
개인 도구
로그인하지 않음
토론
기여
로그인
이름공간
문서
토론
한국어
보기
읽기
편집
원본 편집
역사 보기
더 보기
검색
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보