Подскажите правильно отобразить подробное описание - PullRequest
1 голос

Не знаю, как раньше жил без этого форума :) Подскажите пожалуйста, где я go ошибся? Я создал модель поведения в представлениях, создал URL-адрес, но когда я нажимаю на заголовок, он не отображает go подробное описание события. Может быть ошибка в том, что я наследую в DetailViews? Я прикрепляю код ниже

Просмотры:

from django.shortcuts import get_object_or_404, render
from django.views.generic import DetailView
from django.views.generic.base import View

from .models import Blog, Event
# Create your views here.



class EventView(View):
    def get(self, request):
        events = Event.objects.all()
        posts = Blog.objects.all()
        return render(request, "home/home.html", {"events": events, "posts":posts})


class BlogDetailView (View):
    def get(self, request, slug):
        posts = Blog.objects.get(url=slug)
        return render(request, "home/blog-detail.html", {"posts": posts})


class EventViewDetail(DetailView):
    model = Event
    template_name = "event/event-detail.html"
    slug_field = "name"

URL:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.EventView.as_view()),
    path("<slug:slug>/", views.BlogDetailView.as_view(), name="home_detail"),
    path("event/<str:slug>/", views.EventViewDetail.as_view(), name="event_detail")
]

HTML:

<!-- Latest-Events-Sermons -->
<section class="section-padding latest_event_sermons m-0">
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-lg-5">
                <div class="heading">
                    <h3>Анонс событий</h3>
                    <a href="#" class="btn btn-secondary btn-md pull-right">Показать все</a>
                </div>
                <div class="event_list">
                    <ul>
                        {% if events %}
                            {% for e in events %}
                                <li>
                                    <div class="event_info">
                                        <div class="event_date">
                                            <span>{{ e.dataStart}}</span>
                                        </div>
                                        <h6><a href="{% url "event_detail" %}">{{ e.name }}</a></h6>
                                        <ul>
                                            <li><i class="fa fa-clock-o"></i>{{ e.dataStart }}</li>
                                            <li><i class="fa fa-map-marker"></i> {{ e.adress}}</li>
                                        </ul>
                                    </div>
                                </li>
                            {% endfor %}
                        {% else %}
                            <p>У вас нет материала</p>
                        {% endif %}
                    </ul>
                </div>
            </div>

Модели:

from django.db import models
from datetime import date
from django.urls import reverse

# Create your models here.


class Blog(models.Model):
    """Новости"""
    name = models.CharField("Заголовок", max_length=100)
    description = models.TextField("Описание")
    descriptionTwo = models.TextField("Описание (второй абзац)", blank=True, default="")
    blockquote = models.TextField("Цитата", blank=True, default="")
    short = models.TextField("Краткое описание", max_length=300)
    poster = models.ImageField("Изображение", upload_to="news/")
    prewiew = models.ImageField("Превью", upload_to="news/")
    dataPost = models.DateField("Дата публикации", default=date.today)
    url = models.SlugField(max_length=160, unique=True, blank=True)
    draft = models.BooleanField("Черновик", default=False)


    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("home_detail", kwargs={"slug": self.url})


    class Meta:
        verbose_name = "Новости"
        verbose_name_plural = "Новости"


class Event(models.Model):
    """События"""
    name = models.CharField("Заголовок", max_length=100)
    adress = models.TextField("Адрес")
    description = models.TextField("Описание")
    short = models.TextField("Краткое описание")
    phone = models.TextField("Контактный номер телефона")
    email = models.EmailField()
    image = models.ImageField("Изображение", upload_to="event/")
    dataStart = models.DateField("Дата старта", default=date.today)

    def __str__(self):
        return self.name


    class Meta:
        verbose_name = "Событие"
        verbose_name_plural = "События"

Ответы [ 2 ]

1 голос
/ 09 мая 2020

event_detail должен получить один параметр в шаблоне, который вы не передаете. Таким образом, вы можете сделать что-то вроде этого,

<h6><a href="{% url "event_detail" e.slug %}">{{ e.name }}</a></h6>

Примечание: ваш slug не должен быть пустым, вы можете предварительно заполнить slug именем event_name при регистрации ваших моделей на странице администратора, т.е. prepopulated_fields = {"slug": ( "event_name",)} ИЛИ Вместо использования slug вы также можете использовать pk

<h6><a href="{% url "event_detail" e.pk %}">{{ e.name }}</a></h6>

Надеюсь, это поможет.

0 голосов

Все таки решил эту проблему. Я скопировал vievs и url-адреса кода события из блога для этого события. Но это не сработало, так как URL-адрес совпадает, и я просто дал всем свой URL-адрес в каталоге URL-адресов. Вот код решения.

Очень важный момент, открытие происходит при нажатии на заголовок события на главной странице. Функция get_absolute_url отвечает за адрес ссылки, находя функцию в models.py.

Просмотры:

from django.shortcuts import get_object_or_404, render
from django.views.generic.base import View

from .models import Blog, Event
# Create your views here.



class EventView(View):
    def get(self, request):
        events = Event.objects.all()
        posts = Blog.objects.all()
        return render(request, "home/home.html", {"events": events, "posts":posts})


class BlogDetailView (View):
    def get(self, request, slug):
        posts = Blog.objects.get(url=slug)
        return render(request, "home/blog-detail.html", {"posts": posts})


class EventViewDetail(View):
    def get(self, request, slug):
        events = Event.objects.get(url=slug)
        return render(request, "event/event-detail.html", {"events": events})

Urls:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.EventView.as_view()),
    path("news/<slug:slug>/", views.BlogDetailView.as_view(), name="home_detail"),
    path("event/<slug:slug>/", views.EventViewDetail.as_view(), name="event_detail"),
]

Модели:

from django.db import models
from datetime import date
from django.urls import reverse

# Create your models here.


class Blog(models.Model):
    """Новости"""
    name = models.CharField("Заголовок", max_length=100)
    description = models.TextField("Описание")
    descriptionTwo = models.TextField("Описание (второй абзац)", blank=True, default="")
    blockquote = models.TextField("Цитата", blank=True, default="")
    short = models.TextField("Краткое описание", max_length=300)
    poster = models.ImageField("Изображение", upload_to="news/")
    prewiew = models.ImageField("Превью", upload_to="news/")
    dataPost = models.DateField("Дата публикации", default=date.today)
    url = models.SlugField(max_length=160, unique=True, blank=True)
    draft = models.BooleanField("Черновик", default=False)


    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("home_detail", kwargs={"slug": self.url})


    class Meta:
        verbose_name = "Новости"
        verbose_name_plural = "Новости"


class Event(models.Model):
    """События"""
    name = models.CharField("Заголовок", max_length=100)
    adress = models.TextField("Адрес")
    description = models.TextField("Описание")
    short = models.TextField("Краткое описание")
    phone = models.TextField("Контактный номер телефона")
    email = models.EmailField()
    image = models.ImageField("Изображение", upload_to="event/")
    dataStart = models.DateField("Дата старта", default=date.today)
    url = models.SlugField(max_length=160, blank=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("event_detail", kwargs={"slug": self.url})


    class Meta:
        verbose_name = "Событие"
        verbose_name_plural = "События"

HTML Домашняя страница (блок «событие»):

<!-- Latest-Events-Sermons -->
<section class="section-padding latest_event_sermons m-0">
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-lg-5">
                <div class="heading">
                    <h3>Анонс событий</h3>
                    <a href="#" class="btn btn-secondary btn-md pull-right">Показать все</a>
                </div>
                <div class="event_list">
                    <ul>
                        {% if events %}
                            {% for e in events %}
                                <li>
                                    <div class="event_info">
                                        <div class="event_date">
                                            <span>{{ e.dataStart}}</span>
                                        </div>
                                        <h6><a href="{{ e.get_absolute_url }}">{{ e.name }}</a></h6>
                                        <ul>
                                            <li><i class="fa fa-clock-o"></i>{{ e.dataStart }}</li>
                                            <li><i class="fa fa-map-marker"></i> {{ e.adress}}</li>
                                        </ul>
                                    </div>
                                </li>
                            {% endfor %}
                        {% else %}
                            <p>У вас нет материала</p>
                        {% endif %}
                    </ul>
                </div>
            </div>

HTML Страница события (блок «контент»)

<section class="post_detail section-padding">
    <div class="container">
        <div class="row">
            <div class="col-md-8">
                <div class="post_img">
                    <img src="assets/images/events_detail.jpg" alt="image">
                    <div class="event_timer">
                        <div class="date">
                            <span>20</span>
                            Aug, 19
                        </div>
                        <div class="timer">
                            <div id="countdown"></div>
                        </div>
                    </div>
                </div>
                <h2>{{ events.name }}</h2>
                <div class="post_meta">
                    <ul>
                        <li><i class="fa fa-clock-o"></i> {{ event.dataStart }}</li>
                        <li><i class="fa fa-map-marker"></i> {{ event.adress }}t</li>
                    </ul>
                </div>
                <p>{{ events.description }}</p>
                <div class="row">
                    <div class="col-lg-7">
                        <ul>
                            <li><i class="fa fa-check-circle"></i> Internet tend to repeat predefined chunks.</li>
                            <li><i class="fa fa-check-circle"></i> Contrary to popular belief, Lorem Ipsum is not simply
                            </li>
                            <li><i class="fa fa-check-circle"></i> On the other hand, we denounce with righteous</li>
                            <li><i class="fa fa-check-circle"></i> In a free hour, when our power of choice is
                                untrammelled
                            </li>
                            <li><i class="fa fa-check-circle"></i> But in certain circumstances and owing.</li>
                        </ul>
                    </div>
                    <div class="col-lg-5">
                        <div class="venu_map">
                            <iframe
                                    src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d7060970.521913474!2d-102.60272453381052!3d37.588245893295074!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x54eab584e432360b%3A0x1c3bb99243deb742!2sUnited+States!5e0!3m2!1sen!2sin!4v1495005824042"
                                    style="border:0" allowfullscreen></iframe>
                        </div>
                    </div>
                </div>
                <br>
                <a href="#" class="btn btn-primary"><i class="fa fa-plus"></i> Google Cal</a>
                <a href="#" class="btn btn-primary"><i class="fa fa-plus"></i> ICAL EXPORT</a>
                <br><br>
                <!-- Share -->
                <div class="tags_share">
                    <div class="psot_share border-0">
                        <span><strong>Share:</strong></span>
                        <a href="#"><i class="fa fa-facebook"></i></a>
                        <a href="#"><i class="fa fa-twitter"></i></a>
                        <a href="#"><i class="fa fa-google-plus"></i></a>
                        <a href="#"><i class="fa fa-linkedin"></i></a>
                    </div>
                </div>

                <!-- Comments -->
                <div id="comments">
                    <div class="all_comments">
                        <h4>2 Comments</h4>
                        <ul class="commentlist">
                            <li class="comment">
                                <div class="comment the-comment">
                                    <div class="comment-avatar">
                                        <img alt="image" src="assets/images/member_1.jpg" class="avatar">
                                    </div>
                                    <div class="comment-content">
                                        <div class="comment-meta">
                                            <span class="comment-author"> <a href="#" class="url">Groot Will</a></span>
                                            <span class="comment-time">/ <span> 15 May, 2018</span></span>
                                        </div>
                                        <div class="text">
                                            <div class="comment-text">
                                                <p>That far ground rat pure from newt far panther crane lorikeet overlay
                                                    alas cobra across much
                                                    gosh less goldfinch ruthlessly alas examined and that more and the
                                                    ouch jeez.</p>
                                                <span class="reply"> <a rel="nofollow" class="comment-reply-link"
                                                                        href="#"><i
                                                        class="fa fa-comments"></i> Reply</a> </span>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <ol>
                                    <li class="comment">
                                        <div class="comment the-comment">
                                            <div class="comment-avatar">
                                                <img alt="image" src="assets/images/member_1.jpg" class="avatar">
                                            </div>
                                            <div class="comment-content">
                                                <div class="comment-meta">
                                                    <span class="comment-author"> <a href="#" class="url">Groot Will</a></span>
                                                    <span class="comment-time">/ <span> 15 May, 2018</span></span>
                                                </div>
                                                <div class="text">
                                                    <div class="comment-text">
                                                        <p>That far ground rat pure from newt far panther crane lorikeet
                                                            overlay alas cobra across much
                                                            gosh less goldfinch ruthlessly alas examined and that more
                                                            and the ouch jeez.</p>
                                                        <span class="reply"> <a rel="nofollow"
                                                                                class="comment-reply-link" href="#"><i
                                                                class="fa fa-comments"></i> Reply</a> </span>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </li>
                                </ol>
                            </li>
                        </ul>
                    </div>
                    <!-- /all-comment -->
...