Django 빌트인 CBV를 통한 Form 처리
2022. 1. 24. 22:07ㆍ강의 정리/Django Form
반응형
장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!
Built-in CBV API
- Generic editing views
- 폼을 통해 객체를 생성, 수정, 삭제하는 기능을 제공하는 뷰
- FormView, CreateView, UpdateView, DeleteView
- FormView
- CreateView : post_new()를 구현할 수 있다.
- UpdateView : post_edit()를 구현할 수 있다.
- DeleteView : post_delete()를 구현할 수 있다.
- https://docs.djangoproject.com/en/4.0/ref/class-based-views/generic-editing/
post_new()
@login_required
def post_new(request):
if request.method == 'POST':
# forms.py의 PostForm
form = PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user # 현재 로그인한 유저 Instance
post.save()
messages.success(request, '포스팅을 저장했습니다.')
# post의 detail.html로 이동함.
# redirect는 view 함수 내에서 특정 url로 이동하고자 할 때 사용
# model에 지정된 get_absolute_url로 이동
return redirect(post)
else:
form = PostForm()
return render(request, 'instagram/post_form.html',{
'form' : form,
#새 글을 작성할 당시 post는 Null값일수도 있기에 None을 리턴한다.
'post' : None,
})
post_edit()
@login_required
def post_edit(request, pk):
# get_object_or_404는 model을 첫번째 인자로 받고, 몇개의 키워드 인수를 get() 함수에 넘김
post = get_object_or_404(Post, pk=pk)
# 이렇게 반복되는 코드가 있다면 장식자로 만드는 것도 좋은 방법
# 작성자만 수정할 수 있도록
if post.author != request.user:
messages.error(request, '작성자만 수정 가능합니다!')
return redirect(post)
if request.method == 'POST':
form = PostForm(request.POST, request.FILES, instance=post)
if form.is_valid():
post = form.save()
messages.success(request, '포스팅을 수정했습니다.')
# post의 detail.html로 이동함.
return redirect(post)
else:
form = PostForm(instance=post)
return render(request, 'instagram/post_form.html',{
'form' : form,
#수정한다는 것은 이미 원글이 있다는 뜻이기에 post를 리턴한다.
'post' : post,
})
post_delete()
@login_required
def post_delete(request, pk):
# get_object_or_404는 model을 첫번째 인자로 받고, 몇개의 키워드 인수를 get() 함수에 넘김
post = get_object_or_404(Post, pk=pk)
# 유저가 삭제 확인을 했을 때는
if request.method == 'POST':
post.delete()
messages.success(request, '성공적으로 삭제하였습니다.')
return redirect('instagram:post_list')
return render(request, 'instagram/post_confirm_delete.html', {
'post' : post,
})
FormView
- 폼이 주어지면 해당 폼을 출력
- TemplateResponseMixin과 BaseFormView를 상속받는다
Example myapp/forms.py:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
def send_email(self):
# send email using the self.cleaned_data dictionary
pass
Example myapp/views.py:
from myapp.forms import ContactForm
from django.views.generic.edit import FormView
class ContactFormView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = '/thanks/'
def form_valid(self, form):
# This method is called when valid form data has been POSTed.
# It should return an HttpResponse.
form.send_email()
return super().form_valid(form)
def get_success_url(self):
# 주의 : Post 모델에 get_absolute_url() 멤버함수 구현 필요
return resolve_url(self.object)
# return self.post.get_absolute_url() 대안 1
# return reverse('blog:post_detail', args=[self.post.id]) 대안 2
post_new = PostCreateView.as_view()
Example myapp/contact.html:
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Send message">
</form>
CreateView
- 객체를 생성하는 폼 출력
#instagram/views.py
from django.views.generic import CreateView
from myapp.models import Post
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
form_class = PostForm
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = self.request.user # 현재 로그인한 유저 Instance
messages.success(self.request, '포스팅을 저장했습니다.')
return super().form_valid(form)
post_new = PostCreateView.as_view()
Example myapp/author_form.html:
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
UpdateView
- 기존 객체를 수정하는 폼을 출력
#instagram/views.py
from django.views.generic.edit import UpdateView
from myapp.models import Post
class PostUpdateView(LoginRequiredMixin, UpdateView):
model = Post
form_class = PostForm
def form_valid(self, form):
messages.success(self.request, '포스팅을 수정했습니다.')
return super().form_valid(form)
post_edit = PostUpdateView.as_view()
Example myapp/author_update_form.html:
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update">
</form>
DeleteView
- 기존 객체를 삭제하는 폼을 출력
Example myapp/views.py:
from django.urls import reverse_lazy
from django.views.generic.edit import DeleteView
from myapp.models import post
class PostDeleteView(LoginRequiredMixin, DeleteView):
model = Post
success_url = reverse_lazy('instagram:post_list')
# reverse_lazy는 실제 값이 사용될 때 reverse를 해줌으로 오류 예방
#def get_success_url(self):
#return reverse('instagram:post_list')
post_delete = PostDeleteView.as_view()
- success_url
- 지정된 개체가 삭제되었을 때 리디렉션할 url
- /parent/{parent_id}/ 처럼 사전 문자열 형식을 포함할 수 있다
post_delete() 함수의 return redirect('instagram:post_list')와 같은 역할을 한다.
Example myapp/author_confirm_delete.html:
<form method="post">{% csrf_token %}
<p>Are you sure you want to delete "{{ object }}"?</p>
{{ form }}
<input type="submit" value="Confirm">
</form>
도움 받은 문서
반응형
'강의 정리 > Django Form' 카테고리의 다른 글
Django 회원가입, 로그인 구현하기!!! (0) | 2022.01.25 |
---|---|
Django Form 삭제 구현! (0) | 2022.01.24 |
Django Messages Framework (0) | 2022.01.24 |
Django Form Validation (0) | 2022.01.19 |
Django ModelForm이란? (0) | 2022.01.19 |