2016-07-12 2 views
1

저는 Python에서 새로 도입되었으므로 자세한 설명을 제공해주십시오. 그래서, 나는에 아약스를 통해 양식을 게시 할 코드가/템플릿/검색에 표시 복귀 후 서버에서 데이터를 얻기 조회 :클래스의 메서드가 클래스 외부에서 반환됩니다.

views.py

class SomeClass(View): 

    def post(self, request, *args, **kwargs): 
     if request.method =='POST': 
     data = request.body 
     qd = QueryDict(data) 
     place = qd.values()[2] 
     indate = qd.values()[3] 
     outdate = qd.values()[0] 
     url = ('http://) 
     req = requests.get(url).text 
     json_data = json.loads(req) 
     self.results = [] 
     for result in json_data.get('hotelList'): 
      self.results.append(result) 

    return HttpResponse(self.results) 


def function(request): 

    var = SomeClass() 
    v = var.results 

    return render(request,'search.html', {'v':v}) 

search.html에

<body> 
    <form id="form" action="" method="post">{% csrf_token %}> 
    <div class="form-group"> 
    <label for="place">Place</label> 
    <input type="text" class="form-control" id="place" placeholder="Input city name"> 
    </div> 
    <div class="form-group"> 
    <label for="check-in">check-in date</label> 
    <input type="text" class="form-control" id="check-in" placeholder="check-in date"> 
    </div> 
    <div class="form-group"> 
    <label for="check-out">check-out date</label> 
    <input type="text" class="form-control" id="check-out" placeholder="check-out date"> 
    </div> 
<button type="submit" class="btn btn-default" id="submit- btn">Submit</button>{% csrf_token %} 
</form> 
<div id="result"> 
{% for result in v %} 
    {{ result }} 
    {% endfor %} 
</div> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script> 

<script type="text/javascript"> 

    $(document).ready(function(){ 
    // posting form using ajaxForm 
    $('#submit-btn').click(function(e) { 
     var options = { 
      type: "POST", 
      target:  '#result', // div to update 
      url:  '/query/', 
      data: { 
      place: $("#place").val(), 
      check_in: $("#check-in").val(), 
      check_out: $("#check-out").val() 

      }, 
      success: function() { 
       alert(''); 

     } 

    </script> 
</body> 

urls.py

urlpatterns += patterns('task6_API.views', 
    url(r'^search/$', 'search_page', name='search'), 
    url(r'^query/$', SomeClass.as_view(), name='search_result'), 

) 

난 그냥 self.result를 반환하는 경우 내가 얻을 :

AttributeError: `'list' object has no attribute 'get'` 

은 그래서 HttpResponse를 사용합니다.

results을 수신해야합니다. 그것을 어떻게 얻을 수 있습니까?

+3

처음? 함수 기반보기에서 클래스 기반보기에 액세스하려고합니까? 나는 이것이 당신이 한 일을 실행하는 올바른 방법이 아니라는 것을 확신합니다. – Selcuk

+0

지금은 함수 기반 뷰 또는 다른 클래스에서 액세스하는지 여부에 관계없이 나를 위해. 가장 중요한 것은 수업에서 반품을 사용하는 방법입니다. 아마도 나는 개념적으로 잘못되었으므로 나를 바로 잡으십시오. – Andriy

+1

무엇을 하려는지 설명하면 더 많이 추측 할 수 있지만 현재 방법이 잘못 지시됩니다. 귀하의 질문에 대답; 'result'는'post' 메소드에 의해 리턴되고 이론적으로는'v = var.post (request)'를 사용하여 액세스 할 수 있습니다. 그러나'post' 메소드는'result'를 계산하기 위해 추가 인수 ('* args' 또는'** kwargs')를 필요로합니다. – Selcuk

답변

0

예제 코드가 실제로 명확하지 않다고 생각합니다. 그래서 저는 일반적으로 실제 질문에 답하려고 시도 할 것입니다.

기본적으로 클래스 메서드는 클래스 인스턴스에서 작동하는 함수이며 일반적으로 "self"라는 암시 적 인수로 전달됩니다. 은 "자기가"도 사용되지 않습니다이 경우

['I am a str in a list'] 
>>> 

를, 그래서 그냥 일반 기능 수 있었다 :

class SomeClass: 

    def some_method(self, request): 
     # do something with request 
     return ["I am a str in a list"] 

instance = SomeClass() 

# Call method on instance. It gets whatever the method returns. 

val = instance.some_method(None) 

print(val) 

이 생산하고 있습니다. 따라서 일반 함수가 요청 처리기로 자주 표시되는 것입니다. 메소드 호출 사이에 어떤 상태를 유지해야 할 경우 대부분 클래스가 필요하며 호출간에 인스턴스를 유지할 수 있습니다.

+0

'some_method (None)'인수를 사용하는 이유는 무엇입니까? – Andriy

+0

'request'를위한 자리 표시 자로서, 예제 메소드는 실제로 그것을 사용하지 않기 때문에. – Keith

+0

어째서? 'post' 메쏘드는 첫 줄에'request.method'를 검사합니다. – Selcuk

0

반환 할 컨텍스트에 결과를 추가해야합니다. 그렇게하려면 get_context_data을 사용하십시오 (ContextMixin에서 사용 가능).

템플릿을 표시하려면 TemplateResponseMixin을 사용하십시오.

이렇게하면 별도의보기 방법이 필요하지 않습니다.

class SomeView(View, ContextMixin, TemplateResponseMixin): 
    template_name = 'search.html' 

    def get_context_data(self, **kwargs): 
     ctx = super(SomeView, self).get_context_data(**kwargs) 
     ctx['v'] = self.result 
     return ctx 

    def post(self, *args, **kwargs): 
     self.result = [] 
     for data in json_data.get('somedata'): 
      self.result.append(data) 
당신이 처음에 여기에 클래스 기반의 뷰를 사용하는 이유는 정말 볼 수 없습니다

, 당신의 코드는 훨씬 간단 할 것입니다 : 왜 당신은이 작업을 수행하려고

def function(request): 
    result = [] 

    if request.POST: 
     json_data = json.loads(request.POST['some_field']) 
     result = list(json_data['somedata']) 

    return render(request, 'search.html', {'v': result}) 
+0

고맙습니다.하지만 어떻게 함수 기반 뷰에서'ctx'를 사용할 수 있습니까? – Andriy

+0

대단히 상세한 답변을 해주셔서 고맙습니다. 그러나 별도의보기로 코드를 나누는 이유는 하나의 URL에 대해 아약스 게시가 있고 다른 URL에 렌더링 페이지가 있어야한다는 것입니다. 내 urls.py에 두 개의 다른 URL이 있습니다. . 내 상황에 정확히 그것을 만드는 방법? – Andriy

+0

질문을 편집하고 문제를 자세히 설명해야한다고 생각합니다. –

관련 문제