Django - переключение языка с данными запроса - PullRequest
0 голосов
/ 30 августа 2011

Привет! У меня есть страница результатов поиска, которая возвращает запросы из базы данных, используя это представление:

def search(request):
show_results = False
# check if POST
if 'q' in request.POST:
    query = request.POST['q'].strip()
# check if GET (paginated)
if 'q' in request.GET:
    query = request.GET['q'].strip()
# check if query length is more than 2 characters and proceed
if query and len(query) > 2:
    # if there is a query string show results (as opposed to arriving without any POST/GET      
    show_results = True
    keywords = query.split()
    q = Q()
    for keyword in keywords:
        q = q & (Q(title__icontains=keyword) | (Q(keywords__icontains=keyword)))
        query_set = Article.objects.filter(q)
    # create a new paginator instance with items-per-page
    paginator = Paginator(query_set, 10)

    # get the page number from a get param if param is blank then set page to 1 
    page = int(request.GET.get('page', '1')) 

    # grab the current page from the paginator...  
    items = paginator.page(page)

    # update search counter with term
    try:
        term = Search.objects.get(term=query)
    except Search.DoesNotExist:
        # if not already in db, then add query
        term = Search(term=query)

    term.counter += 1
    term.last_search = datetime.now()
    term.save()

elif len(query) <= 2:
    short_string = True
else:
    pass
#render the template and pass the contacts page into the template  
return render_to_response('search_results.html',
                            locals(), context_instance=RequestContext(request)) 

и шаблон:

{% load i18n %}
<form action="/i18n/setlang/" name=postlink   method="post">
    <ul class="lang">
         <li class="lang" style="color:gray">
                {% for lang in LANGUAGES %}

                    {% if lang.0 != LANGUAGE_CODE %}
                        <input type="hidden" name="language" value="{{ lang.0 }}">
                        <a href=# onclick="submitPostLink()">{{ lang.1 }}</a>
                    {% else %}
                        {{ lang.1 }}
                    {% endif %}
                {% endfor %}
        </li></ul>
</form>

Переключение языков отлично работает на всех страницах, кроме одного случая. Когда я отправляю данные об изменении языка на странице результатов поиска, где результаты не возвращены (т. Е. Пустой набор запросов), я получаю следующую ошибку:

UnboundLocalError at /search/
local variable 'query' referenced before assignment

Я думаю, что мне нужно немного изменить вид, но я не уверен, где. Любые предложения высоко ценится.

Traceback:

traceback: `Environment:


Request Method: GET
Request URL: http://localhost:8000/search/

Django Version: 1.3
Python Version: 2.7.1
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'journal',
'django.contrib.admin']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfResponseMiddleware')

 Traceback:
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
 111.                         response = callback(request, *callback_args,       **callback_kwargs)
File "/home/sam/public_html/django- projects/galapagos_research/../galapagos_research/journal/views.py" in search
 40.    if query and len(query) > 2:

Exception Type: UnboundLocalError at /search/
Exception Value: local variable 'query' referenced before assignment

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Вы не определили query, если q не в POST или GET. Так как это единственное место, где может появиться эта ошибка, вы не должны передавать q. Пустой QuerySet не вызовет эту ошибку.

Конечно, было бы полезно иметь строку, которая вызвала ошибку (traceback - пожалуйста).

def search(request):
    show_results = False

    query = None # set default value for query

    # check if POST
    if 'q' in request.POST:
        query = request.POST['q'].strip()

    # check if GET (paginated)
    if 'q' in request.GET:
        query = request.GET['q'].strip()

    ###########################
    # was `query` defined here if 'q' isn't in POST or GET? 
    ###########################


    # check if query length is more than 2 characters and proceed
    if query and len(query) > 2: # error probably on this line?
0 голосов
/ 30 августа 2011

В начале запрос никогда не устанавливается по умолчанию.

if 'q' in request.POST:
    query = request.POST['q'].strip()
# check if GET (paginated)
if 'q' in request.GET:
    query = request.GET['q'].strip()

Затем в вашем elif вы пытаетесь определить len () запроса, который еще нигде не определен, если 'q' отсутствует в GET или POST.

elif len(query) <= 2:
    short_string = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...