Django视图与Javascript函数之间的连接

时间:2019-05-07 21:58:26

标签: javascript python html django

我目前正在设置我的Django项目,它是一个搜索引擎,并且我一直在尝试建立自定义Django View和Javascript函数之间的连接,但是我一直遇到问题,因此我决定从开始并希望得到某人的帮助。

我有这个Javascript代码

const data = []  // Not sure how to get the data from the backend??

let index = 0;
let results = [];
const randomSearchMatchPercentages = ( array ) => {
    for ( const element of array ) {
        // define a maximum and a minimum range
        const maximum = index <= 100 ? 100 - index : 0;
        const minimum = maximum > 0 ? maximum - 5 : 0;

        element.match = Math.round( Math.random() * ( maximum - minimum ) + minimum ) + "%";
        results.push( element );

        // decrease the maximum and minimum for the next iteration
        index += 5;
    }
console.log( results );
}

randomSearchMatchPercentages( data );

我需要连接一个这样的自定义视图:

def MatchingScore(request):

    return JsonResponse(output)

我已经建立了一个连接,并通过此视图从后端获取了自动完成的数据:

def autocomplete(request):
    sqs = SearchQuerySet().autocomplete(
        content_auto=request.GET.get('query',''))[:5]
    destinations = {result.destination for result in sqs}
    s = [{"value": dest, "data": dest} for dest in destinations]
    output = {'suggestions': s}
    return JsonResponse(output)

并使用此Javascript函数:

$(function () {
    'use strict';

    $('#q').autocomplete({
    serviceUrl: "http://127.0.0.1:8000/search/autocomplete/",
    minChars: 2,
    dataType: 'json',
    type: 'GET',
    onSelect: function (suggestion) {
        console.log( suggestion.value + ', data :' + suggestion.data);
    }
});

});

但是我不知道在def MatchingScore中放入什么代码,以及如何修改Javascript代码使其正常工作。我假设我需要以与autocomplete View相同的方式从数据库中获取数据,并将其传递给javascript函数。

我的目标非常简单:生成介于100%和0%之间的随机数,并将其显示在如下所示的html列表中:

<div>
{% if  page_obj.object_list %}
      <ol class="row top20">

        {% for result in page_obj.object_list %}

     <li class="list-item">
      <div class="showcase col-sm-6 col-md-4">
           <a href="{{ result.object.get_absolute_url }}">
              <h3>{{result.object.title}}</h3>
              <img src="{{ result.object.image }}" class="img-responsive">
           </a>
      </div>
     <li>

         {% endfor %}
      </ol>
</div>

{% else %}
        <p> Sorry, no result found </p>
{% endif %}

我该怎么做?

编辑:

我有一个用于Django-Haystack的自定义Forms.py文件,用于搜索功能:

from haystack.forms import FacetedSearchForm


class FacetedProductSearchForm(FacetedSearchForm):

    def __init__(self, *args, **kwargs):
        data = dict(kwargs.get("data", []))
        self.ptag = data.get('ptags', [])
        super(FacetedProductSearchForm, self).__init__(*args, **kwargs)

    def search(self):
        sqs = super(FacetedProductSearchForm, self).search()

        if self.ptag:
            query = None
            for ptags in self.ptag:
                if query:
                    query += u' OR '
                else:
                    query = u''
                query += u'"%s"' % sqs.query.clean(ptags)
            sqs = sqs.narrow(u'ptags_exact:%s' % query)

        return sqs

然后,使用此类将自定义表单传递到我的视图中:

from haystack.generic_views import FacetedSearchView as BaseFacetedSearchView
from .forms import FacetedProductSearchForm

class FacetedSearchView(BaseFacetedSearchView):

    form_class = FacetedProductSearchForm
    facet_fields = ['ptags']
    template_name = 'search_result.html'
    paginate_by = 20
    context_object_name = 'object_list'

我尝试了第一种方法,但没有得到任何搜索结果,并且由于我已经拥有paginationobject_name,因此可以同时实现{{1 }}和def MatchingScore通过缩进或其他方式进入此类,以便我可以在此模板标记内调用def random_search_match_percentages? :

match

1 个答案:

答案 0 :(得分:0)

如果我正确理解问题,那么我认为您可以通过两种不同的方法来实现此目标。

一种方法是:您可以将要运行的Javascript代码转换为Python代码(因为它不执行诸如处理DOM之类的任何特定JavaScript的工作),然后从Unexpected error occurred in scheduled task. <org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.>org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:305) 调用它,并传递数据像使用MatchingScore函数一样抓住它。

autocomplete

然后,您可以在此from django.shortcuts import render from django.core.paginator import Paginator def random_search_match_percentages(array): from random import random from math import floor index = 0 results = [] for element in array: # define a maximum and a minimum range maximum = 100 - index if index <= 100 else 0 minimum = maximum - 5 if maximum > 0 else 0 num = floor(random() * (maximum - minimum) + minimum + 0.5) element.match = '{}%'.format(num) # add the match param results.append(element) # decrease the maximum and minimum for the next iteration index += 5 return results # small tip: this naming convention you are using is generally used # for python classes, not function. Generally python developers # write function names using snake case, like this: matching_score def MatchingScore(request): some_data = MyModel.objects.all() # just an example of grabbing data... paginator = Paginator(some_data, per_page=20) page_obj = paginator.get_page(page) results = random_search_match_percentages(page_obj) return render(request, 'my_app/my_view.html', {'results': results}) 中访问数据,就像Django模板代码段一样。

在应用模板文件夹中创建一个my_view.html文件,即:my_view.html,其中包含以下内容:

django_project/my_app/templates/my_app/my_view.html

另一种方法是:

1)创建django视图,以返回所需的JSON数据(例如,像<div> {% if results|length %} <ol class="row top20"> {% for result in results %} <li class="list-item"> <div class="showcase col-sm-6 col-md-4"> <a href="{% url 'some-product-url' result.django_id %}"> <h3>{{ result.title }}</h3> <!-- use the match param added on the random_search_match_percentages function --> <p>{{ result.match }}</p> <img src="{{ result.image }}" class="img-responsive"> </a> </div> </li> {% endfor %} </ol> {% else %} <p>Sorry, no result found</p> {% endif %} </div> 视图)

autocomplete

2),然后做一个简单的视图

def matching_score_data(request):
    # grab your data...
    return JsonResponse(data)

3)然后,将您的JavaScript代码放入`my_view.html中。对于数据,您可以进行AJAX调用以获取数据。渲染列表。您将需要使用JavaScript来操作DOM。

from django.shortcuts import render


def MatchingScore(request):
    return render(request, 'my_app/my_view.html')

恕我直言:我认为一种方法更容易,因为您具有django模板引擎的强大功能,并且不需要使用javascript处理DOM。此外,您只需要创建一个视图即可,而不是两个。

参考: