2016-07-12 2 views
1

私はPythonで新しくなっていますので、詳細な説明をしてください。 だから、私は私が上でAJAXを経由してフォームをポストコードを持っている/テンプレート/検索に表示するために返すようにし、サーバー上のデータを取得するクエリ:クラスのメソッドをクラス自体の外に返す

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を使う。

私はfunctionresultsを受け取る必要があります。どうすれば入手できますか?

+3

なぜあなたはこれをやろうとしている:私は本当にあなたがここに最初の場所でクラスベースのビューを使用している理由を、あなたのコードはとはるかに簡単になります表示されていない

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) 

最初の場所?関数ベースのビューからクラスベースのビューにアクセスしようとしていますか?私はこれがあなたが後にしているものを実装する正しい方法ではないと確信しています。 – Selcuk

+0

今のところ私は機能ベースのビューや他のクラスからアクセスするかどうかは関係ありません。主なものは、授業外のリターンを使う方法です。おそらく私は概念的に間違っているので、私を修正してください。 – Andriy

+1

あなたは何を達成しようとしているのかを説明すればさらに多くのことを推測することができますが、あなたの現在の方法は間違って間違っています。あなたの質問に答える。 'result'は' post'メソッドによって返され、理論的に 'v = var.post(request)'を使ってアクセスできます。しかし、 'post'メソッドはおそらく、' result'を計算するために余分な引数( '* args'や' ** kwargs')を必要とします。 – Selcuk

答えて

0

私はあなたの例のコードは本当に明確ではないと思う。だから私は、一般的に、実際の質問に答えるようにしようとします。

基本的に、クラスメソッドは、クラスインスタンス上で動作し、通常 "self"という暗黙の引数として渡される単なる関数です。

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) 

これが生成します。

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

をここでは「自己」でも使用されていないので、それは単なる機能だったかもしれません。このため、多くの場合、プレーンな機能が要求ハンドラとして認識されます。メソッド呼び出しの間にある状態を保持する必要があり、呼び出し間でインスタンスを生かし続けることができる場合は、主にクラスが必要です。

+0

なぜ 'some_method(None)'引数を使用しますか? – Andriy

+0

'request'のプレースホルダとして、実際にはメソッドのメソッドが使用していないためです。 – Keith

+0

どうしてですか? 'post'メソッドは最初の行で' request.method'をチェックします。 – Selcuk

0

返すコンテキストに結果を追加する必要があります。これを行うには、、ContextMixinから入手できます。

テンプレートを表示するには、TemplateResponseMixinを使用します。

これにより、別個の表示方法が不要になります。

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

詳細な回答はありがたいですが、別のビューにコードを分割する理由は、1つのURLに対してajax投稿をしてから、他のurlにページをレンダリングする必要があるということです。私のurls.pyには2つの異なるURLがあります。私の状況でそれを正確にする方法? – Andriy

+0

私はあなたの質問を編集し、あなたの問題を詳細に説明すべきだと思います。 –

関連する問題