created: function () {
console.log("created()...");
this.fetch_all_todo();
},
methods: {
fetch_all_todo: function () {
console.log("fetch_all_todo()...");
var vm = this;
axios.get('/api/todo/list/')
.then(function (res) {
console.log("GET RES", res);
vm.todoList = res.data;
})
.catch(function (err) {
console.log("GET ERR", err);
})
},
var vm = this; ... callback() 정의
data, safe 인자가 중요하다.
Django에서 response를 날려주면, Vue는 res.data로 받으면 된다.
ListView는 기본적으로 HTTP Response를 보낸다. Json Response로 바꿔주려면 어떻게 해야되나 ?
self.render_to_response(context)
를 return 하고 있다.render_to_reponse
method를 살펴보면 self.reponse_class
를 return 하고 있다. 이것이 바로 HTTP Response이므로 Json Response로 조작하기 위해서는 이 method를 overriding 해야된다. def render_to_response(self, context, **response_kwargs):
todoList = list(context['object_list'].values())
return JsonResponse(data=todoList, safe=False)
get_queryset()
method를 보면, self.model._default_manager.all()
부분이 해당 모델에 대한 all DB를 불러오는 것이다.get_context_data()
method를 보면 context에 object_list라는 key에 queryset이 mapping 되는 것을 알 수 있다. def render_to_response(self, context, **response_kwargs):
todoList = list(context['object_list'].values())
return JsonResponse(data=todoList, safe=False)
remove_todo: function (todo, index) {
console.log("remove_todo()...", index);
if (confirm("Really delete ?") == false) return;
var vm = this;
axios.delete('/api/todo/' + todo.id + '/delete/')
.then(function (res) {
console.log("DELETE RES", res);
vm.todoList.splice(index, 1);
})
.catch(function (err) {
console.log("DELETE ERR", err);
})
},
path('todo/<int:pk>/delete/', views.ApiTodoDelV.as_view(), name='delete'),
# @method_decorator(csrf_exempt, name='dispatch')
class ApiTodoDelV(BaseDeleteView):
model = Todo
def delete(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.delete()
return JsonResponse(data={}, status=204)
views.py
해당 ccbv 에서 확인해보면 delete method를 오버라이딩 해야하는 것을 알 수 있다.
Django에서는 csrf 방어를 제공해주고 있다.
# @method_decorator(csrf_exempt, name='dispatch')
add_todo: function () {
console.log("add_todo()...");
if (this.todo == '') return;
if (this.name == '') this.name = '홍길동';
var vm = this;
var postData = {name: this.name, todo: this.todo};
axios.post('/api/todo/create/', postData)
.then(function (res) {
console.log("POST RES", res);
vm.todoList.push({id: res.data.id, name: res.data.name, todo: res.data.todo});
})
.catch(function (err) {
console.log("POST ERR", err)
})
this.name = this.todo = '';
},
path('todo/create/', views.ApiTodoCV.as_view(), name='create'),
# @method_decorator(csrf_exempt, name='dispatch')
class ApiTodoCV(BaseCreateView):
model = Todo
fields = '__all__'
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['data'] = json.loads(self.request.body)
return kwargs
def form_valid(self, form):
print("form_valid()", form)
self.object = form.save()
newTodo = model_to_dict(self.object)
print(f"newTodo: {newTodo}")
return JsonResponse(data=newTodo, status=201)
def form_invalid(self, form):
print("form_invalid()", form)
print("form_invalid()", self.request.POST)
print("form_invalid()", self.request.body.decode('utf8'))
return JsonResponse(data=form.errors, status=400)