Я хочу реализовать поиск нескольких моделей в django, что означает, что я хочу искать разные поля в двух моделях.
Моими двумя моделями являются «История» и «Место»:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from places.models import Place
from django.urls import reverse
class Story (models.Model):
title = models.CharField(max_length=100,blank=False)
content = models.TextField(blank=False)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
Place = models.ForeignKey(Place, on_delete=models.PROTECT)
audio = models.FileField(default='SOME STRING', upload_to='audio_stories/',blank=False)
class Place (models.Model):
name = models.CharField(max_length=100, blank=False)
country = models.ForeignKey(Country, on_delete=models.PROTECT, null=True)
city = models.ForeignKey(City, on_delete=models.PROTECT, null=True)
description = models.TextField(blank=False)
location_image = models.ImageField(default='default.jpg', upload_to='location_pics/', blank=False)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('place-detail', kwargs={'pk': self.pk})
def save(self):
super().save()
img = Image.open(self.location_image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.location_image.path)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('story-detail', kwargs={'pk': self.pk})
My View объединяет оба запроса.
from django.shortcuts import render, get_object_or_404, redirect
from django.db.models import Q
from django.views.generic import (ListView)
from django.contrib.auth.models import User
from places.models import Place
from .models import Story
class SearchResultsView(ListView):#
template_name = 'story/results.html'
def get_queryset(self):
request = self.request
query = request.GET.get('q', None)
if query is not None:
story_list = Story.objects.filter(Q(title__icontains=query))
place_list = Place.objects.filter(Q(name__icontains=query))
results = chain(story_list, place_list)
return results
Наконец, я отображаю поиск в шаблоне:
{% extends "story/base.html" %}
{% block content %}
{% load static %}
<form class="form-inline my-2 my-lg-0" method="get">
<input name="q" class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
<h1>Search Results Stories</h1>
<div class="row">
<div class="col-md-8 narrow ">
{% for story in object_list %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{ story.author.profile.image.url }}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2" href="{% url 'user-stories' story.author.username %}">{{ story.author }}</a>
<small class="text-muted">{{ story.date_posted|date:"F d, Y" }}</small>
</div>
<h2><a class="article-title" href="{% url 'story-detail' story.id %}">{{ story.title }}</a></h2>
<p class="article-content">{{ story.content }}</p>
<audio
controls
src="{{ story.audio.url }}">
Your browser does not support the
<code>audio</code> element.
</audio>
<small class="text-muted">{{ story.Place }}, {{ story.Place.city }}</small>
</div>
</article>
{% endfor %}
<h1>Search Results Places</h1>
{% for place in place %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{place.location_image.url}}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2">{{ place.city }}</a>
<small class="text-muted">Germany</small>
</div>
<h2><a class="article-title" href="{% url 'place-detail' place.id %}">{{ place.name }}</a></h2>
<p class="article-content">{{ place.description }}</p>
</div>
</article>
{% endfor %}
</div>
</div>
{% endblock content%}
Когда я набираю 'Town', я должен получить:
"Заглавие города-сюжета" из модели модели (Название)
"Город-название населенного пункта" из модели места ( Имя)
Почему-то работает только поиск в "Заголовке" модели, но результаты поиска в "Местах" не отображаются.