Reputation: 29
i want to pass the listview of post model and detailview of movies model in the same template using class based views
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
want to print detailview of model Movies from pk of movies passed in urls
i passed the movies name and pk from url but cant get other detail like in detailview we get from pk
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'),
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')
here i want to shoe the detail of movie and the post detail
<!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>
Upvotes: 1
Views: 518
Reputation: 23972
Add the model details in context so you have them available at your template like:
...
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
Upvotes: 3