[Python] Django / How to refer to a specific news in views so that it is possible to leave a...

Discussão em 'Python' iniciado por Stack, Agosto 16, 2025.

  1. Stack

    Stack Membro Participativo

    When submitting a form on the site, the "news_id" value is not pulled into the database (into the table with comments). Accordingly, it is not clear to which news a comment was left so that it could be published later.

    There are Russian symbols in the code, but they do not affect the essence of the problem in any way.

    models:

    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"]


    forms:

    class CommentForm(forms.ModelForm):
    content = forms.CharField(
    label='Добавить комментарий',
    widget=forms.Textarea(attrs={'rows': '4', 'class': 'form-control'}))

    class Meta:
    model = Comments
    fields = ['content']


    utils:

    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


    views:

    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())


    html:

    <div class="col-md-10 offset-md-1">
    {% with news.comments_news.count as comments %}
    <p>
    <h3>Комментарии ({{ comments }})</h3>
    </p>
    {% endwith %}
    </div>
    <div class="col-md-10 offset-md-1 bg-white rounded-start-top-0 p-3 rounded">
    {% for comment in news.comments_news.all %}
    <p>{{ comment.user }} написал(а) {{ comment.time_create }}</p>
    {{ comment.content|linebreaks }}
    <hr>
    {% endfor %}
    </div>
    {% if user.is_authenticated %}
    <form class="col-md-10 offset-md-1" method="POST">
    {% csrf_token %}
    <div class="form-error">{{ form.non_field_errors }}</div>
    {% for f in form %}
    <p>
    <label class="form-label">{{ f.label }}:</label>
    {{ f }}
    </p>
    <div class="form-error">{{ f.errors }}</div>
    {% endfor %}
    <div>
    <button type="submit" class="btn btn-color" onclick="alert('Ваш комментарий отправлен на проверку.')">Отправить</button>
    </div>
    </form>
    {% endif %}


    I understand that you need to somehow get the News model object in the views file, but all the methods that I found were not successful.

    Continue reading...

Compartilhe esta Página