У меня есть модель поста с целой кучей постов. У меня также есть модель журнала, которая имеет поле внешнего ключа для модели Post. По сути, в модели Log хранятся записи в журнале для записей в модели Post (в основном, в комментариях Post). Все шло отлично. Я использовал CBV для своих моделей постов, и я использовал CBV для просмотра своих записей в журнале. Затем я добавил ссылку, чтобы перенаправить меня в Log CreateView, используя следующий тег привязки:
<a class="btn" href="{% url 'log-create' post_id=logs.post_id %}">Add Entry</a>
Когда начали возникать ошибки NoReverse. Когда я изменяю log.post_id на 1, страница загружается правильно. Это приводит меня к мысли, что log.post_id не возвращает никакого значения. Еще одна мысль, которая у меня возникла, заключалась в том, что, поскольку этот тег привязки был в LogListView, было несколько записей журнала, поэтому он не знал, какой post_id использовать. Но я использовал функцию get_queryset в этом представлении, чтобы убедиться, что возвращаются только журналы, относящиеся к одному сообщению. На мой взгляд, log.post_id должен работать.
Мои модели:
class Post(models.Model):
title = models.CharField(max_length=100, blank=True)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
overview = models.TextField(blank=True)
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.id})
def __str__(self):
return self.title
class Log(models.Model):
post = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
log_entry = models.TextField(max_length=500, blank=True)
log_author = models.ForeignKey(User, on_delete=models.CASCADE)
date_posted = models.DateTimeField(default=timezone.now)
Мои просмотры:
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView, CreateView
from .models import Post, Log
from django.http import HttpResponseRedirect
from django.contrib.auth.mixins import LoginRequiredMixin
class LogListView(ListView):
model = Log
template_name = 'blog/log_entries.html'
context_object_name = 'logs'
ordering = ['-date_posted']
def get_queryset(self):
self.post = get_object_or_404(Post, log=self.kwargs['pk'])
return Log.objects.filter(post=self.post)
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(LogListView, self).get_context_data(**kwargs)
# Add in a QuerySet of all images related to post
context['post'] = Post.objects.all()
return context
class LogCreateView(LoginRequiredMixin, CreateView):
model = Log
fields = [
'log_entry'
]
def form_valid(self, form):
form.instance.log_author = self.request.user
post = Post.objects.get(pk=self.kwargs['post_id'])
return super().form_valid(form)
Мои urls.py
from django.urls import path, include
from . import views
from .views import LogListView, LogCreateView
urlpatterns = [
path('', PostListView.as_view(), name='blog-home'),
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
path('post/new/', PostCreateView.as_view(), name='post-create'),
path('post/<int:pk>/log/', LogListView.as_view(), name='log-list'),
path('post/<int:post_id>/log/new/', LogCreateView.as_view(), name='log-create'),
]
И, наконец, мой шаблон:
{% extends "blog/base.html"%}
{% block body_class %} home-section {% endblock %}
{% block content %}
<div class="container">
<h2>Log Entries</h2>
{% for log in logs %}
<div class="row">
<article class="content-section">
<div class="article-metadata log-metadata">
<a class="mr-2" href="{% url 'profile' user=log.log_author %}">{{ log.log_author }}</a>
<small class="text-muted">{{ log.date_posted|date:"d F Y" }}</small>
{% if request.user.is_authenticated and request.user == log.log_author %}
<a href="#"><ion-icon name="trash"></ion-icon></a>
{% endif %}
</div>
<p class="">{{ log.log_entry }}</p>
</article>
</div>
{% endfor %}
<a class="btn" href="{% url 'log-create' post_id=logs.post_id %}">Add Entry</a>
</div>
{% endblock content %}
Я думаю, что правильно передаю параметр в URL. это видно из того, когда я делаю post_id = 1. Но я не уверен, что звоню правильно. Любая помощь в этом вопросе была бы большой благодарностью.
ОБНОВЛЕНО: я отредактировал свое context_object_name в моем LogListView для журналов, чтобы сделать цикл for менее запутанным. По сути, я пытаюсь получить один тег привязки внизу всех записей журнала для перенаправления на страницу добавления записи.