Search
castle

CBV(Class Based View)

  • django의 parent class 기능을 사용
    • Overriding으로 기능 수정
  • 기본 template name 지정되어 있음
    • templat_name : template 이름 변경
  • <class>/as_view() : urls에서 view 지정
  • from django.views.generic import ListView, CreateView, DeleteView, UpdateView, ...

ListView

  • 블로그 전체 리스트 클래스
  • ordering : order by
  • html
    • post_list : 전체 post 리스트
# blog\templates\blog\post_list.html

<!-- content -->
{% block content %}
    <!-- content -->
    {% for post in post_list %}
    <!-- Featured blog post-->
    <div class="card mb-4">
        {% if post.uploaded_image %}
            <a href="{{ post.get_absolute_url }}"><img class="card-img-top" src={{ post.uploaded_image.url }} alt="..." /></a>
        {% else %}
            <a href="{{ post.get_absolute_url }}"><img class="card-img-top" src={% static "blog/images/image.png" %} alt="..." /></a>
        {% endif %}
...        

class PostListView(ListView):
    model = Post
    ordering = "-pk"

DetailView

  • post_detail.html : defalt template
  • html
    • post : detail post
#  blog\templates\blog\post_detail.html
...
{% if user.is_authenticated and comment.author == user %}
    <div class="col-lg-2">
        <a href='/blog/{{ post.pk }}/comment_update/{{ comment.id }}' class="mb-4">
            <input type='submit' value='수정' class="btn btn-primary"></input>
        </a>
    </div>

    <div class="col-lg-1">
        <a href='/blog/{{ post.pk }}/comment_delete/{{ comment.id }}' class="mb-4">
            <input type='submit' value='삭제' class="btn btn-primary"></input>
        </a>
    </div>
{% endif %}
...

CreateView

  • fields : form.py의 fields 작성, 즉 Query의 속성 값 지정
  • self.request : request
  • form_valid(self, form) : form형식 검사(postform.is_valid)
    • 검사 자동 실행, instance를 인자로 받아옴
    • form : temp_post = postform.save(commit=False)에 해당
  • LoginRequiredMixin : 로그인했음?
  • http
    • form : postform
# blog\views_class.py

...
class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'category', 'content', 'uploaded_image', 'uploaded_file']
    # post_form.html
    
    def form_valid(self, form):
        current_user = self.request.user
        
        if current_user.is_authenticated:
            form.instance.author = current_user
            return super(PostCreateView, self).form_valid(form)
        else:
            return redirect('post_list')
...            

# blog\templates\blog\post_form.html

<!-- content -->
{% block content %}
    <form action='' method='post', enctype='multipart/form-data'>
        {% csrf_token %}
        {{ form }}
        <input type='submit'>
    </form>
{% endblock %}

DeleteView

  • post_confirm_delete.html : default template
  • success_url : 삭제 후 redirect url
  • UserPassesTestMixin : 작성자임?
class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post
    # success_url = '../../'
    success_url = '/blog/'
    # template_name = 'blog/post_detail.html'
left
right

C

Contents