Django 프로젝트-To Do List(8): User Specific Data
1. User specific data - Listview
앞서 로그인되지 않은 사용자가 데이터를 볼 수 없게 하였다면 이제는 유저마다 각자의 데이터만 볼 수 있게 하는 기능을 구현해야 한다. 바꿔야할 뷰는 ListView와 CreateView 두 가지인데, 자신의 데이터가 아니면 데이터를 보여서도 안되고 생성할 수 있어서도 안되기 때문이다.
우선 ListView부터 수정을 해보자. 여기에서는 데이터가 로그인된 사용자 자신의 것만 보일 수 있게 해야한다. 이를 위해서 get_context_data 메서드를 이용하면 된다.
메서드를 자세히 살펴보자. 우선 get_context_data는 딕셔너리 자료형을 인수로 받는다. 이를 사용하기 위해서는 몇 가지의 절차가 필요하다. get_context_data 메서드는 부모 클래스인 ListView로 부터 상속받는데, 이를 활용하기 위해 super()라는 메서드가 필요하다. 이는 자식 클래스에서 부모 클래스의 함수를 사용하고 싶을 경우 사용한다. ListView의 get_context_data는 여러 개의 context_data를 받고 싶을 때 사용하는 함수로 이를 통해 데이터를 받는다. 여기서 중요한 점은 우리는 사용자 각자의 데이터만 보여주어야하므로 필터를 이용하여 자신의 데이터만 볼 수 있게 처리한다.
# task/views.py
class TaskList(LoginRequiredMixin, ListView):
model = Task
context_object_name = 'tasks'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['tasks'] = context['tasks'].filter(user=self.request.user)
context['count'] = context['tasks'].filter(complete=False).count()
return context
2. User specific data - CreateView
다음은 자신의 페이지가 아니면 모델을 생성할 수 없게 CreateView도 수정해야한다. 여기에서 사용해야 할 메서드는 form_valid인데 이는 사용자와 입력받은 폼의 사용자 인스턴스가 같은지 확인하고 입력받은 폼을 전달해주는 역할을 한다. 함수형뷰에서 볼 수 있는 render(request, ‘task/task_list.html’, ‘form’:form)과 같은 역할을 수행한다고 보면 된다.
# task/views.py
class TaskCreate(LoginRequiredMixin, CreateView):
model = Task
fields = ['title', 'description', 'complete']
success_url = reverse_lazy('tasks')
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
3. 검색 기능
task 검색을 위해 먼저 템플릿을 만들어보자. 폼의 GET을 이용하여 데이터를 불러오자.
<!-- task/templates/task/task_list.html -->
<form method="GET">
<input type="text" name="search-area" value="">
<input type="submit" value="Search">
</form>
다음은 요청한 데이터를 보낼 수 있는 뷰를 작성해야 한다. context를 보낼 수 있는 함수 밑에 search_input을 통해 폼에 입력한 데이터를 받는다. 그리고 이를 필터링하여 tasks에 돌려준다. 또한 폼에 입력한 내용이 사라지지 않게 하기 위해 검색한 내용을 다시 돌려준다.
# task/views.py
class TaskList(LoginRequiredMixin, ListView):
model = Task
context_object_name = 'tasks'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['tasks'] = context['tasks'].filter(user=self.request.user)
context['count'] = context['tasks'].filter(complete=False).count()
search_input = self.request.GET.get('search-area') or ''
if search_input:
context['tasks'] = context['tasks'].filter(title__startswith=search_input)
context['search_input'] = search_input
return context
핵심요약
- get_context_data()
- form_valid()
Leave a comment