簡體   English   中英

如何在同一模板中傳遞另一個 model 的列表視圖和另一個 model 的詳細視圖

[英]How to pass the listview of another model and detailview of another model in same template

我想使用基於 class 的視圖在同一模板中傳遞 model 后的列表視圖和電影 model 的詳細視圖

視圖.py

    from django.shortcuts import render, get_object_or_404
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.urls import reverse
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView, TemplateView
from .models import Post, Movies
from django.contrib.auth.models import User


class AboutView(TemplateView):
    template_name = 'blog/about.html'


class MoviesListView(ListView):
    model = Movies
    template_name = 'blog/home_movies.html'
    ordering = ['-date_released']
    context_object_name = 'movies'
    paginate_by = 10


class MoviesDetailListView(ListView):
    template_name = 'blog/post_list.html'
    context_object_name = 'posts'
    paginate_by = 10

    def get_queryset(self):
        user = get_object_or_404(Movies, name=self.kwargs.get('name'))
        return Post.objects.filter(name=user).order_by('-date_posted')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        movie = get_object_or_404(Movies, pk=self.kwargs.get('pk'))
        context["movie"] = movie


class UserPostListView(ListView):
    model = Post
    template_name = 'blog/user_post.html'  # app/model_viewtype.html
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 10

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-date_posted')


class PostDetailView(DetailView):
    model = Post
    context_object_name = 'posts'


class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    context_object_name = 'posts'
    fields = ['title', 'content', 'name']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)


class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    template_name = 'blog/user_post_update.html'
    fields = ['title', 'content', 'name']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

    def get_success_url(self, **kwargs):
        # obj = form.instance or self.object
        return reverse("movies-detail", kwargs={'name': self.object.name, 'id': self.object.id})


class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post

    def get_success_url(self, **kwargs):
        # obj = form.instance or self.object
        return reverse("movies-detail", kwargs={'name': self.object.name, 'id': self.object.id})

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

想要從通過 url 傳遞的電影 pk 打印 model 電影的詳細視圖

我從 url 傳遞了電影名稱和 pk 但無法獲得其他詳細信息,例如我們從 pk 獲得的 detailview

網址.py

urlpatterns = [

    path('about/', AboutView.as_view(), name='blog-about'),
    path('user/<str:username>/', UserPostListView.as_view(), name='user-post'),
    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),

    path('post/new/<str:name>/<int:id>/', PostCreateView.as_view(), name='post-create'),
    path('', MoviesListView.as_view(), name='blog-home'),
    path('<str:name>/<int:pk>/',MoviesDetailListView.as_view(), name='movies-detail'),
    path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
    path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),

模型.py

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from PIL import Image


class Movies(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    producer = models.CharField(max_length=100)
    director = models.CharField(max_length=100)
    date_released = models.DateTimeField(default=timezone.now)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    class Meta:
        verbose_name_plural = "Movies"

    def __str__(self):
        return self.name


def get_id():
    return


class Post(models.Model):

    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.ForeignKey(Movies, on_delete=models.CASCADE,default=1)

    def __str__(self):
        return self.title
    # return reverse('post-detail' , kwargs={'pk':self.pk})

    def get_absolute_url(self):
        return reverse('blog-home')

post_list.html

在這里我想了解電影的細節和帖子的細節

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <meta name="keywords" content="footer, address, phone, icons" />

<meta name='viewport' content='width=device-width, initial-scale=1'>
<script src='https://kit.fontawesome.com/a076d05399.js'></script>

    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css">
    <link href="http://fonts.googleapis.com/css?family=Cookie" rel="stylesheet" type="text/css">
    <link rel="stylesheet" href="style.css">


    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">


    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

<meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>

 <header class="site-header">
      <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
        <div class="container">
            <a class="navbar-brand mr-4" href="{% url 'blog-home' %}"><p style="font: normal 36px 'Cookie', cursive;margin:0px;">Axon <span style="color:#5383d3;">Blog</span></p></a>
          <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggle" aria-controls="navbarToggle" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarToggle">
            <div class="navbar-nav mr-auto">
              <a class="nav-item nav-link" href="{% url 'blog-home' %}"><i class="fa fa-fw fa-home" style="font-size:18px;"></i> Home</a>
              <a class="nav-item nav-link" href="{% url 'blog-about' %}"><img src="https://img.icons8.com/ios/20/000000/about.png"/> About</a>
            </div>
            <!-- Navbar Right Side -->
            <div class="navbar-nav">
                {% if user.is_authenticated %}

                 <a class="nav-item nav-link" href="{% url 'profile' %}"><i class="fas fa-user-alt" style="font-size:18px;"></i> {{ user.username }}</a>
                 <a class="nav-item nav-link" href="{% url 'logout' %}"><i class="fa fa-fw fa-sign-out" style="font-size:16px;"></i> Logout</a>
                {% else %}
                 <a class="nav-item nav-link" href="{% url 'login' %}"><i class="fas fa-sign-in-alt" ></i> Login</a>
                <a class="nav-item nav-link" href="{% url 'register' %}"><i class="fas fa-user-plus" style="font-size:14px;"></i> Register</a>
                {% endif %}
             </div>
          </div>
        </div>
      </nav>

    </header>

 </body>





<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<h1 class="mb-3">Reviews of {{ view.kwargs.name }} ({{ page_obj.paginator.count }})</h1>


<a href="{% url 'post-create'  view.kwargs.name view.kwargs.pk %} "><button class="btn"><i class="fa fa-plus"></i> Add Review</button></a>

<br><br>
{{ object.post_set.all }}
    {% for post in posts %}
        <article class="media content-section">
            <img class="rounded-circle article-img"  src="{{ post.author.profile.image.url }}">
          <div class="media-body">
            <div class="article-metadata">
              <a class="mr-2" href="{% url 'user-post' post.author.username %}">{{ post.author }}</a>
              <small class="text-muted">{{ post.date_posted|date:"F d, Y " }}</small>
            </div>
              <h3><a class="article-title">{{ post.name }}</a></h3>
            <h2><a class="article-title" href="{% url 'post-detail' post.id %}">{{ post.title }}</a></h2>

            <p class="article-content">{{ post.content }}</p>
          </div>
        </article>
    {% endfor %}
    {% if is_paginated %}
        {% if page_obj.has_previous %}
              <a class ="btn btn-outline-info mb-4" href="?page=1">First</a>
              <a class ="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
        {% endif %}

        {% for num in page_obj.paginator.page_range %}
            {% if page_obj.number == num %}
              <a class ="btn btn-info mb-4" href="?page={{ num }}">{{ num }}</a>
                {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
              <a class ="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
            {% endif %}
        {% endfor %}

        {% if page_obj.has_next %}
              <a class ="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next</a>
              <a class ="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>
        {% endif %}


    {% endif %}




</style>
</html>

在上下文中添加 model 詳細信息,以便您可以在模板中使用它們,例如:

...
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    movie = get_object_or_404(Movies, pk=self.kwargs.get('pk'))
    context["movie"] = movie

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM