source

클래스 기반 뷰와 아약스를 사용하는 장고 앱?

lovecheck 2023. 8. 10. 18:54
반응형

클래스 기반 뷰와 아약스를 사용하는 장고 앱?

저는 장고를 배우고 있는데 클래스 기반 뷰를 찾았는데 그 뷰에 Ajax를 어떻게 구현하는지 궁금합니다.

github에서 django 프로젝트를 검색해보니 클래스 기반 뷰를 사용하는 것이 있지만 아약스는 사용하지 않는 것이 있습니다.

그래서... 이 두 가지를 모두 사용하는 오픈 소스 프로젝트를 아는 사람?그런 식으로 배우는 것이 더 쉽습니다.

감사합니다 :)

인기 있는 다작스와 다작스 패키지를 사용하지 않고, 그것은 여전히 간단한 문제입니다.

다음과 같은 요청 개체에 대해 django의 is_ajax() 함수를 감싸는 데코레이터를 작성하는 것이 도움이 될 것입니다.

def ajax_request(function):
    def wrapper(request, *args, **kwargs):
        if not request.is_ajax():
            return render_to_response('error/ajax_required.html', {},
                context_instance=RequestContext(request))
        else:
            return function(request, *args, **kwargs)
    return wrapper

이 특정 오류를 처리하기 위해 agax_required라는 템플릿이 있다고 가정합니다.이와 같은 것은 사용자가 원하지 않는 경우 사용자가 브라우저에 Ajax 특정 URL을 입력하지 못하도록 합니다.

다음은 템플릿을 렌더링하는 클래스 기반의 Ajax 보기입니다.

from django.views.generic.base import TemplateView

class AjaxGeneral(TemplateView):
    template_name= None
    def get(self, request):
        data={}
        return render_to_response(self.template_name, data,
            context_instance=RequestContext(request))

    @method_decorator(ajax_request)
    def dispatch(self, *args, **kwargs):
        return super(AjaxGeneral, self).dispatch(*args, **kwargs)

이제 HTML 스니펫을 렌더링하기만 하면 되는 모든 Ajax에 대해 다음과 같은 짧은 클래스 기반 보기를 정의할 수 있습니다.

class ShowSomeTable(AjaxGeneral):
    template_name="some_table.html"

some_table.html에 html 스니펫이 있다고 가정합니다.

이제 이 보기에 대한 urls.py 항목은 다음과 같습니다.

url(r'showtable/$', ShowSomeTable.as_view()),

그리고 당신은 그것을 Js에서 다음과 같이 정상적으로 부를 수 있습니다.

$(#dynamic-content).load('/showtable');

Ajax 보기는 일반적으로 일반 요청을 처리할 때 다른 형식을 반환하려는 것을 제외하고는 일반 보기와 크게 다르지 않습니다.이 형식은 일반적으로 JSON입니다.

이 설명서에는 JSON을 반환하는 데 사용할 수 있는 혼합물의 예가 나와 있으므로 이를 시작으로 하는 것이 좋습니다.

https://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/ #그저 그런 것 이상의 것

보기를 일반 요청에 응답하시겠습니까, 아니면 AJAX 요청만 처리하시겠습니까?전자의 경우, 일반 GET 요청을 거부하기 위해 render_to_response 메서드에 작은 체크를 입력하는 것이 유일한 트릭입니다.후자의 경우, 위 링크는 Ajax 요청과 일반 요청을 처리하는 보기를 만들 수 있는 상황에 대해 논의합니다.

AJAX 및 기존 보기를 모두 지원하려면 CreateView에 다음과 같은 기능을 추가할 수 있습니다.

# at top of file
from django.http import JsonResponse  

# inside CreateView class
def render_to_response(self, context, **response_kwargs):
    """ Allow AJAX requests to be handled more gracefully """
    if self.request.is_ajax():
        return JsonResponse('Success',safe=False, **response_kwargs)
    else:
        return super(CreateView,self).render_to_response(context, **response_kwargs)

이것은 일반적으로 (방향 수정 등을 통해) 일반 보기를 처리하지만, AJAX의 경우 JsonResponse를 대신 반환합니다.'Success(성공)'를 반환하는 곳에 더 정교한 논리를 추가할 수도 있지만, 이것이 기본 아이디어입니다.

언급URL : https://stackoverflow.com/questions/8059160/django-apps-using-class-based-views-and-ajax

반응형