@darkglare

Как настроить поиск по сайту?

Подскажите, как сделать поиск по новостям сайта.

Поиск по товарам работает.

Приложение Search (поиск по товарам)

urls.py

from django.conf.urls import url
import django.contrib.auth.views
from search.views import SearchResultsView


urlpatterns = [
    # Examples:
    url(r'^$', SearchResultsView.as_view(), name='search_results'),
    
    ]


views.py

from django.db.models import Q
from django.views.generic import TemplateView, ListView

from shop.models import Product

class SearchResultsView(ListView):
    model = Product
    template_name = 'search/search_results.html'
    
    def get_queryset(self): 
        query = self.request.GET.get('q')
        object_list = Product.objects.filter(
            Q(name__icontains=query) | Q(slug__icontains=query)
        )
        return object_list


search_results.html

...

<div class="row isotope-grid">
                {% for product in object_list %}
                
				<div class="col-sm-6 col-md-4 col-lg-3 p-b-35 isotope-item women">
					<!-- Block2 -->
					<div class="block2">
						<div class="block2-pic hov-img0">
							
                   
                            <a href="{{ product.get_absolute_url }}">
                            <img src="{% if product.image1 %}{{ product.image1.url }}{% else %}{% static 'app/content/products/no_image.png' %}{% endif %}">
                               </a>

							<a href="{{ product.get_absolute_url }}" class="block2-btn flex-c-m stext-103 cl2 size-102 bg0 bor2 hov-btn1 p-lr-15 trans-04 "  >
								Смотреть
							</a>
						</div>

						<div class="block2-txt flex-w flex-t p-t-14">
							<div class="block2-txt-child1 flex-col-l ">
								<a href="{{ product.get_absolute_url }}" class="stext-104 cl4 hov-cl1 trans-04 js-name-b2 p-b-6">
									{{ product.name }}
								</a>

								<span class="stext-105 cl3">
									{{ product.price }} руб
								</span>
							</div>

							<div class="block2-txt-child2 flex-r p-t-3">
								<a href="#" class="btn-addwish-b2 dis-block pos-relative js-addwish-b2">
									<img class="icon-heart1 dis-block trans-04" src="{% static 'app/content/site/images/icons/icon-heart-01.png' %}" alt="ICON">
									<img class="icon-heart2 dis-block trans-04 ab-t-l" src="{% static 'app/content/site/images/icons/icon-heart-02.png' %}" alt="ICON">
								</a>
							</div>
						</div>
					</div>
				</div>
                           
                {% endfor %}

...


Модель Product

class Product(models.Model):

...
    #ОБЩИЕ ХАРАКТЕРИСТИКИ 
    category = models.ForeignKey(Category, related_name='products')
    name = models.CharField(max_length=200, db_index=True, verbose_name="Название")
    slug = models.SlugField(max_length=200, db_index=True)
    image1 = models.FileField(upload_to='products/%Y/%m/%d', blank=True, verbose_name = "Картинка_1")
    image2 = models.FileField(upload_to='products/%Y/%m/%d', blank=True, verbose_name = "Картинка_2")
    image3 = models.FileField(upload_to='products/%Y/%m/%d', blank=True, verbose_name = "Картинка_3")
    ...

class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)

    def get_absolute_url(self):
        return reverse('shop:product_detail',
                        args=[self.id, self.slug])

    def __str__(self):
        return self.name


admin.site.register(Product)

...

Поиск по продуктам работает

По тому же принципу делаю поиск по новостям

urls.py

from django.conf.urls import url
import django.contrib.auth.views
from search_post.views import SearchPosts


urlpatterns = [
    # Examples:
    url(r'^$', SearchPosts.as_view(), name='search_results_posts'),
    
    ]


views.py

from django.db.models import Q
from django.views.generic import TemplateView, ListView


from app.models import Blog

class SearchPosts(ListView):
    model = Blog
    template_name = 'search_post/search_results_posts.html'
    
    def get_queryset(self): 
        query = self.request.GET.get('q')
        object_list_posts = Blog.objects.filter(
            Q(title__icontains=query) | Q(slug__icontains=query)
        )
        return object_list_posts


search_results_posts.html

...

<div class="p-b-63">
                           {% for post in object_list_posts %} 
							    <a href="{% url 'blogpost'  parametr=post.id %}" class="hov-img0 how-pos5-parent ">
							 	
                               
                                <img class="hov-img0 how-pos5-parent" src="{{post.image.url}}" alt="Картинка"  />
                                
								<div class="flex-col-c-m size-123 bg9 how-pos5">
									<span class="ltext-107 cl2 txt-center">
										
									</span>

									<span class="stext-109 cl3 txt-center">
										
									</span>
								</div>
							</a>
                            
							<div class="p-t-32">
                                
                                
								
									<p class="ltext-108 cl2 hov-cl1 trans-04">
										{{post.title}}
									
								

								<p class="stext-117 cl6">
									{{post.description}}
								</p>
                                
								<div class="flex-w flex-sb-m  m-b-35"> <!--Тут я задал расстояние между картинками статьи блога m-b-50  (margin-bottom) и убрал p-t-18-->
                                    
									<span class="flex-w flex-m stext-111 cl2 p-r-30 m-tb-10">
										<span>
											<span class="cl4">By</span> {{post.author}} 
											<span class="cl12 m-l-4 m-r-6">|</span>
										</span>
                                        

										<span>
											{{post.posted}}  
											<span class="cl12 m-l-4 m-r-6">|</span>
										</span>

										<span>
											{{ posts.comment_set.count }} Комментариев
										</span>
									</span>

									<a href="{% url 'blogpost'  parametr=post.id %}" class="stext-101 cl2 hov-cl1 trans-04 m-tb-10">
                                        Читать далее
								       <i class="fa fa-long-arrow-right m-l-9"></i>
									</a>
								</div>
                            {% endfor %}
                               {% if object_list_posts %}
                {% else %}
                <h2> В новостях ничего не найдено</h2>
                {% endif %}
							</div>

...


Модель Blog

class Blog(models.Model):
    title = models.CharField(max_length = 100, unique_for_date = "posted", verbose_name = "Заголовок")
    slug = models.SlugField(max_length=200, db_index=True)
    description = models.TextField(verbose_name = "Краткое содержание")
    content = models.TextField(verbose_name = "Полное содержание" ,)
    posted = models.DateTimeField(default = datetime.now(),db_index = True, verbose_name = "Опубликована")
    author = models.ForeignKey(User, null=True, blank=True, on_delete = models.SET_NULL, verbose_name = "Автор")
    image = models.FileField(default = 'temp.jpg', verbose_name = "Путь к картинке")

   

    def get_absolute_urls(self): #метод возвращает строку с уникальным интернет адресом записи
        return reverse("blogpost", args=[str(self.id)])

    def __str__(self):
        return self.title # метод возвращает название используемое для представления отдельных заголовков
    
    class Meta:
        db_table = "Posts" # имя таблицы для модели
        ordering = ["-posted"] # порядок сортировки данных в модели (- означает по убыванию)
        verbose_name = "статья блога" # имя под окторым модель будет отображаться в админ разделе
        verbose_name_plural = "статьи блога" # тоже для всех статей блога

admin.site.register(Blog)


Но список новостей не выводится, что я делаю не так?
  • Вопрос задан
  • 296 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Wolf_girl
devops
object_list_posts = Blog.objects.filter(Q(title__icontains=query) | Q(slug__icontains=query))


Думаю вместо slug__icontains нужно написать content__icontains
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы