Как реализовать два QuerySets в .html - PullRequest
0 голосов
/ 03 июля 2019

Я новичок в Django и пытаюсь понять, как это работает. По сути, я создаю этот простой блог, и у меня есть один вопрос относительно реализации QuerySets в моем файле .html.

Вот так выглядит мой код:

Models.py

class Post(models.Model):
        [...]

class Highlight(models.Model):
        [...]

Views.py

from django.shortcuts import render
from django.utils import timezone
from .models import Post
from .models import Highlight

def post_list(request):
    posts = Post.objects.all
    return render(request, 'blog/post_list.html', {'posts': posts})

def highlight_list(request):
    highlights = Highlight.objects.all
    return render(request, 'blog/post_list.html', {'highlights': highlights})

Urls.py

from django.urls import path
from . import views

urlpatterns = [

path('', views.post_list, name='post_list'),
path('', views.highlight_list, name='highlight_list'),
]

post_list.html

{% for post in posts %}
{{ post }}
{% endfor %}

{% for highlight in highlights %}
{{ highlight }}
{% endfor %}

Проблема в том, что он показывает только объекты из класса Post. Можно ли как-то включить оба QuerySets из обоих классов? Если да, что я делаю не так?

Спасибо!

Ответы [ 3 ]

1 голос
/ 03 июля 2019

Существует так много подходов для достижения этой цели.Я упоминаю один

def post_list(request):
    posts = Post.objects.all()
    highlights = Highlight.objects.all()
    return render(request, 'blog/post_list.html', {'posts': posts, 'highlights':highlights})

Тогда вы можете получить доступ к highlights и posts в post_list.html

0 голосов
/ 03 июля 2019

Уже удалось, спасибо!Если у кого-то еще есть проблема, вот решение:

Views.py

from django.shortcuts import render
from django.utils import timezone
from .models import Post
from .models import Highlight

def post_list(request):
    posts = Post.objects.all
    highlights = Highlight.objects.all
    return render(request, 'blog/post_list.html', {'posts': posts, 'highlights': highlights})
0 голосов
/ 03 июля 2019

Когда вы нажимаете URL-адрес 127.0.0.1:8000, первый соответствующий URL-адрес - path('', views.post_list, name='post_list') этот, потому что в вашем urls.py это ваш первый URL-адрес. Когда есть многократное совпадение, всегда будет вызываться первый.

Следовательно, вызываемая функция просмотра - post_list.

В вашем post_list вы получаете только объекты Post, и поэтому, когда вы возвращаетесь к своему html, только объекты Post обрабатываются, а highlight объектов нет.

Вот почему вы не можете найти никаких highlight объектов в вашем интерфейсе.

Вы можете сделать следующее:

def post_response_with_highlight(request):
    posts = Post.objects.all
    highlights = Highlight.objects.all
    context = {
        'posts': posts,
        'highlights': highlights
    }
    return render(request, 'blog/post_list.html', {'context': context})

И теперь в вашем «html» вы можете получить как posts, так и highlights

...