2016-05-27 15 views
1

Ich versuche django-Heuhaufen mit solr einzurichten ,,, aber ich halte nur den Fehler:UnboundLocalError auf/blog/search/lokale Variable ‚cd‘ verwiesen vor der Zuweisung

UnboundLocalError at /blog/search/ local variable 'cd' referenced before assignment

glaube, ich könnte sei mein

views.py

etwas falsches ,,,. meine App-Namen "Blog" ,, und es gibt bereits mehrere Blogs auf diesem enter image description here

nachdem ich hinzufügen, dass es Kern Blog 8 docs zeigt

enter image description here

hier ist mein

settings.py

# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
import os 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


# Quick-start development settings - unsuitable for production 
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ 

# SECURITY WARNING: keep the secret key used in production secret! 
SECRET_KEY = 'e8m%vu0d&_0o-u*[email protected]^*[email protected]@)p353s%5p)2bx^' 

# SECURITY WARNING: don't run with debug turned on in production! 
DEBUG = True 

ALLOWED_HOSTS = [] 

SITE_ID = 1 

# Application definition 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'blog', 
    'taggit', 
    'django.contrib.sites', 
    'django.contrib.sitemaps', 
    'haystack', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
) 

ROOT_URLCONF = 'mysite.urls' 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

WSGI_APPLICATION = 'mysite.wsgi.application' 


# Database 
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 


# Internationalization 
# https://docs.djangoproject.com/en/1.8/topics/i18n/ 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 


# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.8/howto/static-files/ 

STATIC_URL = '/static/' 



HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'haystack.backends.solr_backend.SolrEngine', 
     'URL': 'http://127.0.0.1:8983/solr/blog' 
    }, 
} 

Ich habe Schema in schema.xml

enter image description here

mein

forms.py

from django import forms 
from .models import Comment 


class EmailPostForm(forms.Form): 
    name = forms.CharField(max_length=25) 
    email = forms.EmailField() 
    to = forms.EmailField() 
    comments = forms.CharField(required=False, widget=forms.Textarea) 


class CommentForm(forms.ModelForm): 
    class Meta: 
     model = Comment 
     fields = ('name', 'email', 'body') 


class SearchForm(forms.Form): 
    query = forms.CharField() 

meine (erraten, etwas falsch hier ??)

views.py

from django.shortcuts import render, get_object_or_404 
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
from django.views.generic import ListView 
from django.core.mail import send_mail 
from django.db.models import Count 

from taggit.models import Tag 

from .models import Post, Comment 
from .forms import EmailPostForm, CommentForm, SearchForm 
from haystack.query import SearchQuerySet 

......... 

def post_search(request): 
    form = SearchForm() 
    if 'query' in request.GET: 
     form = SearchForm(request.GET) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() 
      # count total results 
      total_results = results.count() 
    return render(request, 'blog/post/search.html', {'form': form, 
                'cd': cd, 
                'results': results, 
                'total_results': total_results}) 

mein

search.html

{% extends "blog/base.html" %} 

{% block title %}Search{% endblock %} 

{% block content %} 
    {% if "query" in request.GET %} 
     <h1>Posts containing "{{ cd.query }}"</h1> 
     <h3>Found {{ total_results }} result{{ total_results|pluralize }}</h3> 
     {% for result in results %} 
      {% with post=result.object %} 
       <h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4> 
       {{ post.body|truncatewords:5 }} 
      {% endwith %} 
     {% empty %} 
      <p>There are no results for your query.</p> 
     {% endfor %} 
     <p><a href="{% url "blog:post_search" %}">Search again</a></p> 
    {% else %} 
     <h1>Search for posts</h1> 
     <form action="." method="get"> 
      {{ form.as_p }} 
      <input type="submit" value="Search"> 
     </form> 
    {% endif %} 
{% endblock %} 

urls.py

from django.conf.urls import url 
from . import views 
from .feeds import LatestPostsFeed 


urlpatterns = [ 
     ..... 
     url(r'^search/$', views.post_search, name='post_search'), 
] 

wenn ich den Blog klicken/search es zeigt nur den Fehler

enter image description here

error message

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/blog/search/ 

Django Version: 1.8.8 
Python Version: 3.4.4 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'blog', 
'taggit', 
'django.contrib.sites', 
'django.contrib.sitemaps', 
'haystack') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware') 


Traceback: 
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/Users/korekyourin/books/djexample/mysite/blog/views.py" in post_search 
    112.              'cd': cd, 

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

Antwort

2

In Ihrer post_search Ansicht sind Sie cd nur definieren, wenn die form.is_valid().

Wenn die GET-Anfrage nicht die query Variable enthält, haben Sie nicht die cd Variable, deshalb ist der Fehler passiert.

Versuchen Sie, die return render() in die Bedingung is_valid() einzurücken.

+1

danke ,, nachdem ich die Rückkehr render() zum is_valid Einzug() conditional.and sonst setzen : form = SearchForm() Rendern Rendern (Anfrage, 'Blog/Post/Suche.html ', {' form ': form,}) außerhalb der Bedingung is_valid(), kann es funktionieren –

1

zuerst, Dank für Andre Antwort auf mich ,,, hier ist mein neues

views.py

....... 

def post_search(request): 
    form = SearchForm() 
    if 'query' in request.GET: 
     form = SearchForm(request.GET) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() 
      # count total results 
      total_results = results.count() 
     return render(request, 'blog/post/search.html', {'form': form, 
                 'cd': cd, 
                 'results': results, 
                 'total_results': total_results}) 


    return render(request, 'blog/post/search.html', {'form': form,})