Создание подробного представления с получением get_context_data данных из URL - PullRequest
0 голосов
/ 05 февраля 2019

Я могу выдвинуть строковое значение, title из объекта book, выбранного в URL, чтобы отобразить подробный вид теперь со следующими РЕДАКТИРОВ:

исправил отсутствующий тег %} идобавлен отсутствующий app_name = 'books' для исправления индекса {% url 'book_detail' book.title в {% url 'books:book_detail" book.title %}

views.py

class IndexView(TemplateView):
    template_name = 'app/index.html'

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['book_data'] = Book.objects.all()
        context['books_by_john'] = Books.objects.filter(author = 'John')

        return context

urls.py

app_name = 'books'
urlpatterns = [
    path('login/', views.LoginView.as_view(), name='login'),
    path('login/index/', views.IndexView.as_view(), name='index'),
    path('login/index/<str:key>', views.BookView.as_view(), name ='book_detail')

.html

<ul>
    {% for book in book_data %}
    <li><a href="{% url 'books:book_detail' book.title %}"> {{book.title}} - {{book.name}} - {{book.author}}</a> </li>
    {% endfor %}
</ul>

Теперь, как я смогу использовать значение в этом URL для отображения только данных из конкретной книги в моем подробном представлении?так что он будет делать что-то вроде этого

views.py

class BookView(TemplateView):
    template_name = 'app/book_info.html'

    def get_context_data(self, **kwargs):
        context = super(BookView, self).get_context_data(**kwargs)
        context['book_description'] = Book.objects.filter(title=<title from url>)
        return context

EDIT2: В конце концов мне понадобится несколько наборов данных для извлечения из в IndexView, если это так, я должен использовать просмотр списка?и как мне использовать несколько наборов запросов в списке

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я знаю, что это может быть неправильный способ сделать это (используя TemplateViews вместо ListView и DetailViews).Но так как я собираюсь в конечном итоге использовать несколько наборов данных из нескольких моделей для моего IndexView, я просто застрял с TemplateView.Если кто-то может объяснить, почему это плохая идея, я был бы очень признателен за это

Но я решил эту проблему, добавив slug вместо str к моему пути URL следующим образом:

path('login/index/<slug:title>', views.BookView.as_view(), name ='book_detail')

и добавив context['book_description'] = Book.objects.filter(title = self.kwargs['title']) в мой BookView следующим образом

class BookView(TemplateView):
    template_name = 'app/book_info.html'

    def get_context_data(self, **kwargs):
        context = super(BookView, self).get_context_data(**kwargs)
        context['book_description'] = Book.objects.filter(title = self.kwargs['title'])
    return context

Я смог создать набор данных для фильтрации модели Book по названию в URL в моем шаблоне book_detail.html

 {% for x in book_description %}

    <li>{{ x.summary }}</li>
 {% endfor %}
0 голосов
/ 05 февраля 2019

Ваш шаблонный тег поврежден;вам не хватает закрытия %}.Так что он вообще не анализируется как тег.

Это должно быть:

<li><a href="{% url 'book_detail' book.title %}"> {{book.title}} - {{book.name}} - {{book.author}}</a> </li>

Для вашего другого вопроса вы должны использовать более подходящее представление для подкласса;в вашем случае DetailView будет делать именно то, что вы хотите.(И ваше индексное представление должно основываться на ListView, что полностью исключило бы необходимость использования вашего get_context_data метода.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...