1、创建一个评论的app, comment
python manage.py startapp comment
2、创建数据模型,在models.py中:
class Comment(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
email = models.EmailField(verbose_name='邮箱')
url = models.UrlField(verbose_name='网址')
content = models.TextField(verbose_name='内容')
created_date = models.DateTimeField(auto_now_add = Ture)
post = models.ForeignKey('blog.Post')
def __str__(self):
return self.content[:20]
3、迁移数据库:
python manage.py makemigrations
python manage.py migrate
4、前端页面post_detail.html:
<h3>发表评论</h3> <form action="{% url 'comment:get_comment' post.id %}" method="post" class="comment-form"> {% csrf_token %} <div class="row"> <div class="col-md-4"> <label for="{{ forms.name.id_for_label }}">名字:</label> {{ forms.name }} {{ forms.name.errors }} </div> <div class="col-md-4"> <label for="{{ forms.email.id_for_label }}">邮箱:</label> {{ forms.email }} {{ forms.email.errors }} </div> <div class="col-md-4"> <label for="{{ forms.url.id_for_label }}">网址:</label> {{ forms.url }} {{ forms.url.errors }} </div> <div class="col-md-12"> <label for="id_comment">评论:</label> {{ forms.content }} {{ forms.content.errors }} <button type="submit" class="comment-btn">发表</button> </div> </div> <!-- row --> </form>
form表单:
class commentModelForm(forms.ModelForm): class Meta: model = Comment fields = ['name', 'email', 'url', 'content']
comment/urls.py中:
urlpatterns = [ url(r'^get_comment/(?P<id>\d+)/$', get_comment, name='get_comment'), ]
comment/views:
def get_comment(request, id): post = get_object_or_404(Post, id=id) print('***********',post.get_absolute_url()) if request.method == 'POST': form = commentModelForm(request.POST) if form.is_valid(): comments = form.save(commit=False) comments.post = post comments.save() else: context = { 'post': post, 'form': form, 'comment_list': post.comment_set.all() } return render(request, 'blog/post_detail.html', context) """ * A model: the model's `get_absolute_url()` function will be called. * A view name, possibly with arguments: `urls.reverse()` will be used to reverse-resolve the name. * A URL, which will be used as-is for the redirect location. """ return redirect(post)在post/models.py中:
# 得到绝对路径的url
def get_absolute_url(self): return reverse('blog:post_detail', kwargs={'pk': self.id})
在post/views.py:
def post_detail(request, pk): post = get_object_or_404(Post, id=pk) post.content = markdown.markdown(post.content, extensions=[ 'markdown.extensions.extra', 'markdown.extensions.codehilite', 'markdown.extensions.toc', ]) forms = commentModelForm() comment_list = post.comment_set.all() post.creates_views() return render(request, 'blog/post_detail.html', {'post': post, 'forms': forms, 'comment_list': comment_list})
在前端页面post_detail:
<div class="comment-list-panel"> <h3>评论列表,共 <span>{{ post.comment_set.count }}</span> 条评论</h3> <ul class="comment-list list-unstyled"> {% for comment in comment_list %} <li class="comment-item"> <span class="nickname">{{ comment.name }}</span> <time class="submit-date">{{ comment.create_time }}</time> <div class="text"> {{ comment.content }} </div> </li> {% empty %} 暂无评论 {% endfor %} </ul> </div>