Django: поиск в нескольких моделях - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу реализовать поиск нескольких моделей в 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', я должен получить:

  1. "Заглавие города-сюжета" из модели модели (Название)

  2. "Город-название населенного пункта" из модели места ( Имя)

Почему-то работает только поиск в "Заголовке" модели, но результаты поиска в "Местах" не отображаются.

...