Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2010 08:50:23

diego
От:
Зарегистрирован: 2010-09-14
Сообщения: 78
Репутация: +  0  -
Профиль   Отправить e-mail  

не работает функция поиска

Доброго времени суток! Несколько дней бьюсь над вот такой проблемой.
Есть модель

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.
Есть мысли? потому как мозги уже кипят)



Отредактировано (Окт. 27, 2010 15:59:05)

Офлайн

#2 Окт. 27, 2010 19:49:40

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

не работает функция поиска

diego
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
Как вы думаете, в эту регулярку попадает ‘/search/’?



Офлайн

#3 Окт. 27, 2010 21:47:17

diego
От:
Зарегистрирован: 2010-09-14
Сообщения: 78
Репутация: +  0  -
Профиль   Отправить e-mail  

не работает функция поиска

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/ входила и всё работало.



Отредактировано (Окт. 28, 2010 00:58:54)

Офлайн

#4 Ноя. 5, 2010 19:15:40

diego
От:
Зарегистрирован: 2010-09-14
Сообщения: 78
Репутация: +  0  -
Профиль   Отправить e-mail  

не работает функция поиска

Проблема решена

регулярка

 
url(r'^search/$', 'search', name="cms-search"),
должна предшествовать вот этой
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),



Отредактировано (Ноя. 5, 2010 19:16:33)

Офлайн

#5 Янв. 21, 2011 18:05:50

alezhal
От:
Зарегистрирован: 2010-12-22
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

не работает функция поиска

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',
)
Работает поиск и в админке и по сайту )



Отредактировано (Янв. 21, 2011 18:39:39)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version