Найти - Пользователи
Полная версия: не работает функция поиска
Начало » Django » не работает функция поиска
1
diego
Доброго времени суток! Несколько дней бьюсь над вот такой проблемой.
Есть модель
import datetime
from django.db import models
from django.db.models import permalink
from django.contrib.auth.models import User
from django.contrib import admin
from markdown import markdown
VIEWABLE_STATUS=[3,4]

class ViewableManager(models.Manager):
def get_query_set(self):
default_queryset=super(ViewableManager,self).get_query_set()
return default_queryset.filter(status__in=VIEWABLE_STATUS)



# Create your models here.
class Category(models.Model):
label=models.CharField(blank=True,max_length=50)
slug=models.SlugField()

class Meta:
verbose_name_plural="categories"

def __unicode__(self):
return self.label





class Story(models.Model):
STATUS_CHOICES=(
(1,"Needs Edit"),
(2,"Needs Approval"),
(3,"Published"),
(4,"Archived"),
)

title=models.CharField(max_length=100)
slug=models.SlugField()
category=models.ForeignKey(Category)
markdown_content=models.TextField()
html_content=models.TextField(editable=False)
owner=models.ForeignKey(User)
status=models.IntegerField(choices=STATUS_CHOICES,default=1)
created=models.DateTimeField(default=datetime.datetime.now)
modified=models.DateTimeField(default=datetime.datetime.now)

class Meta:
ordering=['modified']
verbose_name_plural="stories"

def save(self):
self.html_content=markdown(self.markdown_content)
self.modified=datetime.datetime.now()
super(Story,self).save()

admin_objects=models.Manager()
objects=ViewableManager()
@permalink
def get_absolute_url(self):
return ("cms-story",(),{'slug':self.slug})


class CategoryAdmin(admin.ModelAdmin):
prepopulated_fields={'slug':('label',)}


class StoryAdmin(admin.ModelAdmin):
list_display=('title','owner','status','created','modified')
search_fields=('title','content')
list_filter=('status','owner','created','modified')
prepopulated_fields={'slug':('title',)}

admin.site.register(Story,StoryAdmin)
admin.site.register(Category,CategoryAdmin)
Представление
from django.shortcuts import render_to_response, get_object_or_404
from django.db.models import Q
from cms.cmsapp.models import Story, Category

def category(request, slug):
"""Given a category slug, display all items in a category."""
category = get_object_or_404(Category, slug=slug)
story_list = Story.objects.filter(category=category)
heading = "Category: %s" % category.label
return render_to_response("cmsapp/story_list.html", locals())

def search(request):
"""
Return a list of stories that match the provided search term
in either the title or the main content.
"""
if 'q' in request.GET:
term = request.GET['q']
story_list = Story.objects.filter(Q(title__contains='first') | Q(markdown_content__contains=term))
heading = "Search results"
return render_to_response("cmsapp/story_list.html", locals())
base.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
<style type="text/css" media="screen">
body { margin: 15px; font-family: Arial; }
h1, h2 { background: #aaa; padding: 1% 2%; margin: 0; }
a { text-decoration: none; color: #444; }
.small { font-size: 75%; color: #777; }
#header { font-weight: bold; background: #ccc; padding: 1% 2%; }
#story-body { background: #ccc; padding: 2%; }
#story-list { background: #ccc; padding: 1% 1% 1% 4%; }
#story-list li { margin: .5em 0; }
</style>
</head>
<body>
<div id="header">
<form action="{% url cms-search %}" method="get">
<a href="{% url cms-home %}">Home</a> &bull;

<label for="q">Search:</label> <input type="text" name="q">
</form>
</div>
{% block content %}
{% endblock %}
</body>
</html>
story_list.html
{% extends "cmsapp/base.html" %}
{% block content %}
{% if heading %}
<h1>{{ heading }}</h1>
{% endif %}
<ul id="story-list">
{% for story in story_list %}
<li><a href="{{ story.get_absolute_url }}">{{ story.title }}</a></li>
{% endfor %}
</ul>
{% endblock %}
urls.py приложения
from django.conf.urls.defaults import *
from cms.cmsapp.models import Story

info_dict={'queryset':Story.objects.all(),'template_object_name':'story'}




urlpatterns = patterns('django.views.generic.list_detail',
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
url(r'^$', 'object_list', info_dict, name="cms-home"),
)

urlpatterns += patterns('cms.cmsapp.views',
url(r'^category/(?P<slug>[-\w]+)/$', 'category', name="cms-category"),
url(r'^search/$', 'search', name="cms-search"),
)
Вообщем всё как по учебнику. Отбор записей по категориям работает, а вот представление поиска не работает - выдаёт No story found matching the query, я уже даже выводил там чисто все записи но чёт тоже самое выдаёт.

Пока что все сомнения у меня исключительно на стороне функции представления search.
Есть мысли? потому как мозги уже кипят)
Александр Кошелев
diego
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
Как вы думаете, в эту регулярку попадает ‘/search/’?
diego
Daevaorn
diego
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
Как вы думаете, в эту регулярку попадает ‘/search/’?
Спасибо за наводку!

Сначала заменил эту строку на
url(r'^search/(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
и всё заработало, но потом понял что записи на главной странице тоже получат url вида /search/(название статьи)
получается выход тут один - писать ещё одну функцию get_absolute_url и создавать отдельный шаблон?

как я понимаю если убрать ^ то в регулярку будет входить /search/
url(r'(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story")
, но всё равно в тупике, эта регулярка как то используется для генерации адреса в шаблоне, походу так тоже не катит…

или подскажите как отедактировать строку чтобы /search/ входила и всё работало.
diego
Проблема решена

регулярка
 
url(r'^search/$', 'search', name="cms-search"),
должна предшествовать вот этой
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
alezhal
diego
Проблема решена
Доброго времени суток. Для меня эта проблема решена по другому, немного. Два дня мучался, может быть кому-нибудь поможет:

##models.py -здесь вместо content пишем markdown_content
class StoryAdmin(admin.ModelAdmin):
list_display=('title','owner','status','created','modified')
search_fields=('title','content')<--------------------------------здесь
list_filter=('status','owner','created','modified')
prepopulated_fields={'slug':('title',)}
У меня ошибка don't resolve name content

##models.py -Эту регистрацию можно не писать, если зарегистрировать в settings.py, я ниже описал.

##views.py здесь как в книжке должен быть term, а не first в title__contains
if 'q' in request.GET:
term = request.GET['q']
story_list = Story.objects.filter(Q(title__contains='first') | Q(markdown_content__contains=term)) <----- 'first' -откуда оно, почему не term?
heading = "Search results"
return render_to_response("cms/story_list.html", locals())
##cms.urls.py -здесь просто меняем местами
urlpatterns = patterns('cmsproject.cms.views',
url(r'^category/(?P<slug>[-\w]+)/$', 'category', name="cms-category"),
url(r'^search/$', 'search', name="cms-search"),
)

urlpatterns += patterns('django.views.generic.list_detail',
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
url(r'^$', 'object_list', info_dict, name='cms-home'),
)
##settings.py - у меня так иначе ни шаблоны не находил, ни таблицы не создавал из модели
TEMPLATE_DIRS = ("C:/Server/Site/cyborg-ws/www/cmsproject",)
INSTALLED_APPS = (......
.......
'cmsproject.cms',
)
Работает поиск и в админке и по сайту )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB