Django: выборка нескольких моделей

#django

#django

Вопрос:

Это мой первый проект с Django, я хочу воссоздать свой статический сайт HTML / CSS / js на динамический сайт с панелью администратора. Тем не менее, мне трудно понять представления / URL-адреса.В моем индексе у меня есть основные новости, события, мини-новости — 3 категории. Я могу отобразить основные новости, однако я не уверен, что использовать в качестве «возврата» для остальных 2 (все 3 находятся на странице «принадлежит индексу») В настоящее время у меня есть «индекс», но не показывает события / новости.

страницы>view.py

 from django.shortcuts import render, redirect, get_object_or_404
from mainnews.models import Mainnews
from events.models import Event
from mininews.models import Mini

# Create your views here.
def home_view(request):
    main_news = Mainnews.objects.order_by('-publish_date').filter(is_published = True)[:1]
    
    context = {
        'main_news' : main_news
    }

    return render(request, 'index.html', context)

def event_view(request):
    events = Event.objects.order_by('-publish_date').filter(is_published = True)[:3]
    context = {
        'events' : events
    }
    return render(request, 'index.html', context)

def mini_view(request):
    mini_news = Mini.objects.order_by('-publish_date').filter(is_published = True)[:4]
    context = {
        'mini_news' : mini_news
    }
    return render(request, 'index.html', context)
 

главная>urls.py

 from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from pages.views import home_view, event_view, mini_view
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home_view, name = 'home'),
    path('', event_view, name = 'home'),
    path('', mini_view, name = 'home'),
]   static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
 

вот как это выглядит в html

 {% block content %}
  <!-- Section 2 News and Events -->
  <div id="news-container">
    <div class="jumbo-news">
    {%if main_news%}
        {% for obj in main_news%}
        <img id = 'jumboImgUrl' class='jumbo-img'
            src="{{ obj.image.url }}">
        <h2 id = 'jumboTitle' class='jumbo-title'>{{ obj.title }}</h2>
        <h4 id = 'jumboDescription' class='jumbo-parag'>{{ obj.description }}</h4>
        {% endfor %}
    {% else %}
    <div class = 'col-md-12'>
        <p>No news available</p>
    </div>
    {% endif %}
    </div>
    <div id="events" class='eventBox'>
        <h3 class='events-title'>Events <i class="far fa-calendar-alt"></i></h3>
        <div id = 'allEvents' class='all-events'>
        {% if events%}
            {% for event in events %}
                <div id='event' class='event'>
                    <div class='event-date'>
                        <h4 class='date-helper'>{{ event.days }}</h4>
                        <div class='event-line'></div>
                        <h4 class = 'date-month'>{{ event.month }}</h4>
                    </div>
                    <div class = 'paragrah'><p id = 'eventDesc' class='event-text'>{{ event.description}}</p></div>
                </div>
            {% endfor %}
        {% else %}
        <div>
            <p>No events available</p>
        </div>
        {% endif %}
        </div>
    </div>
</div>
</div>
</div>
{% endblock %}
 

Ответ №1:

хорошо, в django url должен быть связан только с одной функцией или классом (не имеет значения) в вашем views.py . но вы соединяете 3 разных пути (рассмотрим один, хотя и с одинаковыми именами) с 3 разными путями. представьте это, если я задам запрос для вашего сайта для вашей домашней страницы, например www.yoursite.come/ , как это сделатьвы хотите разделить эти три и как выбрать, какой из них использовать. но вы можете задать столько запросов, сколько захотите, для стольких моделей, которые у вас есть в одной единственной функции, как это :

 def home_view(request):
    main_news = Mainnews.objects.order_by('publish_date').filter(is_published = True)[:1]
    events = Event.objects.all().order_by('-publish_date').filter(is_published = True)[:3]
    mini_news = Mini.objects.order_by('-publish_date').filter(is_published = True)[:4]
    context = {
        'main_news' : main_news,
        'events' : events,
        'mini_news': mini_news
     }

return render(request, 'index.html', context)
 

и в вашем URL

 urlpatterns = [
path('admin/', admin.site.urls),
path('', home_view, name = 'home'),
 

а затем в вашем шаблоне покажите все это. и если вы хотите показать это отдельно, вы можете сохранить свой код и просто изменить URL на этот

 urlpatterns = [
path('admin/', admin.site.urls),
path('', home_view, name = 'home'),
path('event_view/', event_view, name = 'event_view'),
path('mini_view', mini_view, name = 'mini_view'),
]
 

Ответ №2:

 def home_view(request):
    main_news = Mainnews.objects.order_by('-publish_date').filter(is_published = True)[:1]
    events = Event.objects.all().order_by('-publish_date').filter(is_published = True)[:3]
    mini_news = Mini.objects.order_by('-publish_date').filter(is_published = True)[:4]
    context = {
        'main_news' : main_news,
        'events' : events,
        'mini_news': mini_news
    }

    return render(request, 'index.html', context)