让类的方法返回类本身之外

时间:2016-07-12 04:26:05

标签: python django

我是Python的新手,所以请详细解释一下。 所以,我有代码,我通过ajax on / query发布表单然后获取服务器上的数据返回以显示模板/搜索:

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收到function。我怎么才能得到它?

2 个答案:

答案 0 :(得分: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']
>>>

在这种情况下,“self”甚至没有被使用,所以它可能只是一个普通的功能。这就是您经常将普通函数视为请求处理程序的原因。如果需要在方法调用之间保留一些状态,并且可以在调用之间保持实例处于活动状态,则通常需要类。

答案 1 :(得分:0)

您需要将结果添加到您要返回的上下文中;为此,请使用Screenshot 3中提供的get_context_data

要显示模板,请使用ContextMixin

这完全消除了对单独视图方法的需求。

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})