Как получить данные из другой модели в 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, у вас будет один комментарий, тег на пост. Это ожидаемая часть?

Вернуться на верх