我目前正在设置我的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'
我尝试了第一种方法,但没有得到任何搜索结果,并且由于我已经拥有pagination
和object_name
,因此可以同时实现{{1 }}和def MatchingScore
通过缩进或其他方式进入此类,以便我可以在此模板标记内调用def random_search_match_percentages
? :
match
答案 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。此外,您只需要创建一个视图即可,而不是两个。
参考: