Как получить данные из другой модели в DetailView
Я пытаюсь получить объекты из двух моделей, используя DetailView
. Сначала я установил urls.py:
from django.urls import path
from . views import RetiroListView, RetiroDetailView
from . import views
urlpatterns = [
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
path('post/', views.post, name='post-post'),
]
Вот мои модели:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
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)
class Comment(models.Model):
post = models.OneToOneField(Post, on_delete=models.CASCADE, primary_key=True)
comment=models.CharField(max_length=100)
class Tags(models.Model):
post = models.OneToOneField(Post, on_delete=models.CASCADE, primary_key=True)
comment=models.CharField(max_length=100)
и детальный вид:
class PostDetailView(DetailView):
model = Post
Теперь в моем шаблоне я могу использовать:
{{ object.title }}
Для доступа к информации о моих сообщениях, но мне нужно получить некоторую информацию из других таблиц в этом представлении. Я знаю, что должен переписать метод get_context_data
, но не знаю как.
#1 set queryset variable
class PostDetailView(DetailView):
# model = Post
queryset = {custom queryset}
#2 переопределить метод get_queryset
class PostDetailView(DetailView):
# model = Post
def get_queryset(self, **kwargs):
return {custom queryset}
Вы можете получить доступ к данным связанных объектов в шаблоне без get_context_data
. Например, {{ object.comment.comment }}
отобразит текст комментария для объекта модели Post. Обратите внимание, что object.comment
относится к объекту модели Comment.
Но если я правильно понял идею, я бы посоветовал обратить внимание на ForeignKey
, а не на OneToOneField
. Вот хороший обзор - OneToOneField() vs ForeignKey() в Django.
да, для комментариев это переменная comment, а для тегов это тоже переменная comment
Я не совсем понял это, поэтому я интерпретировал это как приведение комментариев и тегов, связанных с Post.
Это может быть реализовано через набор запросов без необходимости использовать метод get_context_data, предложенный автором вопроса.
views.py
from django.views.generic import DetailView
from .models import Post
# Create your views here.
from django.views.generic import DetailView
from .models import Post
# Create your views here.
class PostDetailView(DetailView):
template_name = "posts/post-detail.html"
context_object_name = "post"
model = Post
Как показано выше, PostDetailView отображает шаблон post-detail.html, а к объекту Post, полученному из этого шаблона, можно обратиться со значением «post», которое является именем контекстного_объекта.
post-detail.html
<html>
<head>
<title>{{ post.title }}</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<div>{{ post.content }}</div>
<div>{{ post.comment.comment }}</div>
<div>{{ post.tags.comment }}</div>
</body>
</html>
Именно поэтому вы можете получить доступ к одному посту, доставленному PostDetailView, когда используете post в качестве переменной шаблона в шаблоне post-detail.
А объекты комментариев и тегов, связанные с постом, также могут быть доступны непосредственно из объекта поста.
post.conmment.(comment field)
post.tags.(tags field)
Такой подход возможен благодаря тому, что вы подключились к OneToOneField. Пожалуйста, обратитесь к этому документу для получения дополнительной информации!
И у меня есть один вопрос.
Если вы подключите комментарии и теги к OneToOneField, у вас будет один комментарий, тег на пост. Это ожидаемая часть?