Django / Wie kann man sich auf bestimmte Nachrichten in Ansichten beziehen, damit es möglich ist, einen Kommentar auf de
Posted: 17 Aug 2025, 00:07
Bei der Übermittlung eines Formulars auf der Site wird der Wert "News_id" nicht in die Datenbank eingezogen (in die Tabelle mit Kommentaren). />
Ich verstehe, dass Sie das Nachrichtenmodellobjekt irgendwie in der Ansichtsdatei erhalten müssen, aber alle Methoden, die ich gefunden habe, waren nicht erfolgreich.
Code: Select all
class News(models.Model):
title = models.CharField(max_length=255, verbose_name="Заголовок")
slug = models.CharField(max_length=255, unique=True, db_index=True, verbose_name="URL")
content = models.TextField(verbose_name="Содержимое")
photo = models.ImageField(upload_to="news/%Y/%m/%d/", verbose_name="Изображение")
video = models.URLField(max_length=255, blank=True, null=True, verbose_name="Ссылка на видео")
time_update = models.DateTimeField(auto_now=True, verbose_name="Время изменения")
category = models.ForeignKey("NewsCategories", on_delete=models.PROTECT, verbose_name="Категория")
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("show_news", kwargs={"news_slug": self.slug})
class Meta:
verbose_name = "Новость"
verbose_name_plural = "Новости"
ordering = ["-time_update"]
class Comments(models.Model):
news = models.ForeignKey(
News,
on_delete=models.CASCADE,
related_name='comments_news',
verbose_name="Новость"
)
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Автор комментария")
time_create = models.DateTimeField(auto_now_add=True, verbose_name="Время создания")
content = models.TextField(verbose_name="Содержимое")
status = models.BooleanField(verbose_name="Публикация комментария", default=False)
def __str__(self):
return self.content
class Meta:
verbose_name = "Комментарий"
verbose_name_plural = "Комментарии"
ordering = ["-time_create"]
< /code>
Formulare: < /p>
class CommentForm(forms.ModelForm):
content = forms.CharField(
label='Добавить комментарий',
widget=forms.Textarea(attrs={'rows': '4', 'class': 'form-control'}))
class Meta:
model = Comments
fields = ['content']
< /code>
utils: < /p>
class DataMixin:
def get_user_context(self, **kwargs):
context = kwargs
cats = NewsCategories.objects.annotate(Count('news'))
context["cats"] = cats
if "category_selected" not in context:
context["category_selected"] = 0
return context
< /code>
Ansichten: < /p>
class ShowNews(DataMixin, DetailView, FormView):
model = News
template_name = "main_app/show_news.html"
slug_url_kwarg = "news_slug"
context_object_name = "news"
form_class = CommentForm
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
c_def = self.get_user_context(title=context["news"])
return dict(list(context.items()) + list(c_def.items()))
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.user = request.user
comment.save()
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
return render(request, self.template_name, self.get_context_data())
< /code>
html: < /p>
{% with news.comments_news.count as comments %}
Комментарии ({{ comments }})
{% endwith %}
{% for comment in news.comments_news.all %}
{{ comment.user }} написал(а) {{ comment.time_create }}
{{ comment.content|linebreaks }}
{% endfor %}
{% if user.is_authenticated %}
{% csrf_token %}
{{ form.non_field_errors }}
{% for f in form %}
{{ f.label }}:
{{ f }}
{{ f.errors }}
{% endfor %}
Отправить
{% endif %}