Как я могу иметь два объекта из двух моделей в одном представлении - PullRequest
0 голосов
/ 22 января 2019

Я пишу приложение для блога django, и у меня проблема с тем, как я могу получить объект Comment в представлении Post. С почтовым объектом проблем нет, потому что я пишу self.get_object() и готово. И вопрос в том, как я могу получить объект Комментарий. Ниже мой код.

Вот вид.

class PostDetail(generic.DetailView, FormMixin):
    template_name = 'post_detail.html'
    context_object_name = 'post'
    model = Post
    form_class = CommentForm

Вот модель поста:

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = RichTextUploadingField()

Вот комментарий модели

class Comment(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    text = RichTextUploadingField()

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Я не знаю, что именно вы хотите сделать !, но из того, что спрашивают, я думаю, что один из способов - это использовать представление на основе функций, подобное этому (я не пробовал, но я ожидаю этого или чего-то еще).очень похоже на работу для вас):

from django.shortcuts import render

def myview(request):
    post_objs = Post.objects.all()
    comment_objs = Comment.objects.all()

    mydict = {'posts':post_obj, 'comments':comment_obj}
    return render(request, 'myapp/myhtml.html', context=mydict)

учитывая ваши отношения «один ко многим», вы также можете пойти дальше и передать точные данные, которые хотите

def myview(request, pk):
    the_post_obj = Post.objects.get(pk=pk)
    comment_objs = Comment.objects.filter(post=the_post_obj)

    mydict = {'the_post':the_post_obj,'comments':comment_objs}
    return render(request, 'myapp/myhtml.html', context=mydict)

Снезависимо от того, что вы написали, теперь вы можете перейти к HTML-файлу и отобразить запрашиваемые данные любым удобным для вас способом.Например, вы можете показать все комментарии одного сообщения.Не забывайте, что для использования второго представления, которое я написал выше, вы должны отправить сообщение PK в представление (например, вы можете поместить его в ссылку в файле HTML, чтобы, когда пользователь нажимает на сообщение (что являетсягиперссылка), сообщение ПК проходит через функцию просмотра, и отображаются соответствующие данные).

0 голосов
/ 22 января 2019

Вы можете получить объект комментария, переопределив get_context_data в detailView, как показано ниже -

def get_context_data (self, ** kwargs): context = super (). Get_context_data (** kwargs) context ['comment'] = self.get_object (). comments.all () возвращает контекст

0 голосов
/ 22 января 2019

Вы можете изменить DetailView на TemplateView и переписать get_context_data (). Смотри: http://ccbv.co.uk/

Или вы можете получить связанные с постом комментарии в своем шаблоне с циклом for:

for comment in self.get_object().comments.all
    # do sth with the comment
...