>[success] # 评论功能 ~~~ 1.整个评论功能在两个地方,第一个地方是在每一个文章详情,第二个地方再友情链接 2.整体的处理逻辑,有一个类负责保存处理提交的评论,一个类负责展示所有消息 ~~~ >[success] # 处理提交评论 >[danger] ##### url ~~~ from comment.views import CommentView url(r'^comment/$', CommentView.as_view(), name='comment'), ~~~ >[danger] ##### 在comment/views 文件下创建CommentView 处理 ~~~ 1.继承模板类TemplateView,这个类主要针对的是模板处理,没有指定的数据库处理返回值 2.分别重写 他们的get 和post 方法 3.由于forms 验证继承的是modelfroms 所有在这里 直接使用save 保存数据库内容 ~~~ ~~~ class CommentView(TemplateView): # 设置访问请求 小写 http_method_names = ['post'] template_name = "comment/result.html" def get(self, request, *args, **kwargs): return super(CommentView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): commnent_form = CommentForm(request.POST) if commnent_form.is_valid(): # 直接保存内容 # 想在返回的form 做添加的 首先设置 不提交 # instance = commnent_form.save(commit=False) # instance.target =target # instance.save() commnent_form.save() succeed = True # 重新跳转 return redirect(target) else: succeed = False context = { 'succeed':succeed, 'form': commnent_form, 'target':target, } return self.render_to_response(context) ~~~ >[danger] ##### 在comment/forms 文件下创建CommentForm 处理form 验证问题 ~~~ 1.可以直接绑定验证 ~~~ ~~~ from django import forms from django.forms import widgets from .models import Comment class CommentForm(forms.ModelForm): target = forms.CharField( widget=widgets.HiddenInput, ) nickname = forms.CharField( label='昵称', max_length=50, widget=widgets.Input( attrs={'class': 'form-control', 'style': "width: 60%;"}, ) ) email = forms.CharField( label='Email', max_length=50, widget=widgets.EmailInput( attrs={'class': 'form-control', 'style': "width: 60%;"}, ) ) website = forms.CharField( label='网站', max_length=100, widget=widgets.URLInput( attrs={'class': 'form-control', 'style': "width: 60%;"}, ) ) content = forms.CharField( label="内容", max_length=500, error_messages={'required':"请认真填写"}, widget=widgets.Textarea( attrs={'rows': 6, 'cols': 60, 'class': 'form-control'}, ) ) def clean_content(self): content = self.cleaned_data.get('content') if len(content) <10: print(1) raise forms.ValidationError('多给一些建议吧') return content class Meta: model = Comment fields = ['target' ,'nickname', 'email', 'website', 'content'] ~~~ >[danger] ##### 在template /comment 文件下创建 bolck 展示评论模板 ~~~ 1.注意现在的评论列表还不能用,要经过下面的操作才可以 ~~~ ~~~ <hr/> <div class="comment"> <form action="/comment/" method="post"> {% csrf_token %} {{ comment_form }} <input class="btn btn-info" type="submit" value="提交评论"> </form> <!-- 评论列表 --> <ul class="list-group"> {% for comment in comment_list %} <li class="list-group-item"> <div class="nickname"> <a href="{{ comment.website }}">{{ comment.nickname }}</a> <span>{{ comment.created_time }}</span> </div> <div class="comment-content"> {% autoescape on %} {{ comment.content }} {% endautoescape %} </div> </li> {% endfor %} </ul> </div> ~~~ >[success] # 评论列表父类 ~~~ 1.因为评论在是,友情链接 和文章都展示,所以这里我们做了一个父类集成 ~~~ >[danger] ##### 在comment/views 创建一个展示父类 ~~~ 1.get_comment 查询 对应评论的链接,在对应的页面展示 ~~~ ~~~ class CommentShowMixin(object): def get_comment(self): target = self.request.path comment = Comment.objects.filter(target=target) return comment def get_context_data(self, **kwargs): kwargs.update({ 'comment_form': CommentForm(initial={'target':self.request.path}), 'comment_list':self.get_comment() }) return super(CommentShowMixin, self).get_context_data(**kwargs) ~~~ >[danger] ##### 使用 ~~~ # 文章详情页 继承即可 class PostView(CommentShowMixin,DeleteView): ~~~