Джанго 1,7 | Форма комментария с сообщением в блоге

Я работаю над блогом, используя Django 1.7.

Я хочу добавить форму комментария к каждому сообщению в блоге, но не знаю, как это сделать.

Вот мой код:

Модели:

class Category(models.Model):
    name = models.CharField(max_length=128, unique=True)
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
            self.slug = slugify(self.name)
            super(Category, self).save(*args, **kwargs)

    def __unicode__(self):
            return self.name

class Post(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    body = models.TextField()
    posted = models.DateTimeField(db_index=True, auto_now_add=True)
    category = models.ForeignKey(Category)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

    def __unicode__(self):
        return '%s' % self.title

class Comment (models.Model):
    comment_body = models.TextField()
    commented_on = models.DateTimeField(db_index=True,auto_now=True)
    commenter = models.ForeignKey(User)
    post = models.ForeignKey(Post)

    def __unicode__(self):
        return '%s' % self.comment_body

class Tag (models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    post = models.ManyToManyField(Post)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Tag, self).save(*args, **kwargs)

    def __unicode__(self):
        return '%s' % self.title

Просмотры:

def blog_post(request, blog_post_slug):
    post_detail = Post.objects.get(slug=blog_post_slug)
    comments = Comment.objects.filter(post=post_detail.id)
    tags = Tag.objects.filter(post=post_detail.id)
    context_dict = {'post': post_detail, 'slug': blog_post_slug, 'comments':comments, 'tags':tags}
    response = render(request,'blog/blog_post.html', context_dict)
    return response

Шаблон:

{% extends 'base.html' %}

{% load staticfiles %}

{% block title %}{{ post.title }}{% endblock %}

{% block body_block %}
<div class="container">
    <div class="post-preview">
    {% if post %}
    <div>
        <h2>{{ post.title }}</h2>
        <small>{{ post.category }}</small>
        <p class="post-meta">{{ post.posted }}</p>
        <p>{{ post.body }}</p>
<h3>Comments</h3>
        {% if comments %}
        {% for comment in comments %}
       <h5> {{ comment.commenter | capfirst }}</h5>
          <p>  {{ comment.comment_body }}</p>
            <small>{{ comment.commented_on }}</small>
        <hr>
        {% endfor %}
        {% else %}
        <small>No comments Yet </small>
        {% endif %}

        <h3>Tags</h3>
        {% if tags %}
        {% for tag in tags %}
       <span> <a href="{% url 'blog:tag' tag.slug %}"> {{ tag.title }}</a>,</span>
        {% endfor %}
        {% else %}
        <small>Without Tags! </small>
        {% endif %}

    </div>
    {% else %}
    <strong>No such post</strong>
    {% endif %}
        </div>
    </div>
{% endblock %}

Я использую form.py для создания форм, но не знаю, что делать в этом сценарии.

Я просто хочу, чтобы зритель мог оставить свои комментарии на странице блога.

1 ответ

Решение

(Этот ответ, вероятно, основан на руководствах по Django на djangoproject.com и, возможно, в других местах)

Вы можете просто определить форму для комментирования в form.py, создать новый экземпляр в своем blog_post() функции, и включить вновь отчеканенную форму в context_dict, Затем в шаблоне используйте {{ thenameyougiveyourforminthecontext }} включить простую версию формы.

Затем в blog_post() метод в views.pyобработайте отправку формы. На веб-сайте Django (в частности, на этой странице) описывается, как обрабатывать отправку формы. В обработке формы, вы можете создать новый Comment объект со словарными записями в form.cleaned_data (при условии, что вы проверили его, используя form.is_valid() сначала) и сохраните его.

Это очень краткий обзор того, как это сделать. Пожалуйста, посмотрите на URL, который я связал, чтобы действительно понять, как это сделать.

Другие вопросы по тегам