侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python Django使用forms来实现评论功能

Python  /  管理员 发布于 7年前   207

貌似Django从版本1.6开始就放弃了对自带的comments的使用,具体原因未查,但是现在使用Django的内部的模块也可以实现评论功能,那就是借助于forms模块,下面是我的一个小例子。

环境准备
 •操作系统 : windows 7 64 位旗舰版
 •IDE: PyCharm 2016.1
 •Python :2.7.11
 •Django :1.9.6

设计

所谓设计,就是指我们将要实现的评论功能将要涉及的底层模型。我这里简单的设计如下,大家按照自己的想法,可以随意的设置,我这里的设置见models.py文件:

 from __future__ import unicode_literalsfrom django.contrib import adminfrom django.db import modelsfrom django import forms# Create your models here.TOPIC_CHOICES = (  ('level1','Bad'),  ('level2','SoSo'),  ('level3','Good'),)class RemarkForm(forms.Form):  subject = forms.CharField(max_length=100,label='Mark Board')  mail = forms.EmailField(label='email')  topic = forms.ChoiceField(choices=TOPIC_CHOICES,label='choose one topic')  message = forms.CharField(label='content for mark',widget=forms.Textarea)  cc_myself = forms.BooleanField(required=False,label='watch this tie')class Remark(models.Model):  subject = models.CharField(max_length=100)  mail = models.EmailField()  topic = models.CharField(max_length=100)  message = models.CharField(max_length=300)  cc_myself = models.BooleanField()  def __unicode__(self):    return self.subject  class Meta:    ordering = ['subject']admin.site.register([Remark,])

大家都看到了,models.py文件里面多了一个forms 的子类,这回因为我们的操作涉及到了网页表单,这样的话,最好给每一个model类创建一个Form表单类,方便从表单中获取cleaned_data。 

url映射文件urls.py

这个文件比较的简单,如下:

"""FormRelative URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:  https://docs.djangoproject.com/en/1.9/topics/http/urls/Examples:Function views  1. Add an import: from my_app import views  2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')Class-based views  1. Add an import: from other_app.views import Home  2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')Including another URLconf  1. Import the include() function: from django.conf.urls import url, include  2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))"""from django.conf.urls import urlfrom django.contrib import adminfrom app.views import *urlpatterns = [  url(r'^admin/', admin.site.urls),  url(r'^remark/$',reamark),]

 视图层views.py

这个文件决定了映射文件对应的展示的视图,所以比较的重要。

from django.shortcuts import renderfrom app.models import *from django.http import *# Create your views here.# subject = models.CharField(max_length=100)#   mail = models.EmailField()#   topic = models.CharField(max_length=100)#   message = models.CharField(max_length=300)#   cc_myself = models.BooleanField()def reamark(request):  if request.method =="POST":    form = RemarkForm(request.POST)    if form.is_valid():      myremark = Remark()      myremark.subject=form.cleaned_data['subject']      myremark.mail = form.cleaned_data['mail']      myremark.topic = form.cleaned_data['topic']      myremark.message = form.cleaned_data['message']      myremark.cc_myself = form.cleaned_data['cc_myself']      myremark.save()      # return HttpResponse("Publish Success!")  else:    form = RemarkForm()  ctx = {    'form':form,    'ties':Remark.objects.all()  }  return render(request,'message.html',ctx)

模板templates/message.html

模板的使用大大的减少了数据量,而且更加灵活的实现了数据在展示层的分离,降低了模块之间的耦合性。

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Title</title></head><body><form action="." method="post">  {% for field in form %}  {% csrf_token %}  <div>    {{ field.label_tag }}:{{ field }}    {{ field.errors }}  </div>  {% endfor %}<div>  <input type="submit" value="Remark"></div></form><hr>{% for tie in ties %}  <div>  <ul>    <li>{{ tie.subject }}</li>    <li>{{ tie.mail}}</li>    <li>{{ tie.topic}}</li>    <li>{{ tie.message }}</li>    <li>{{ tie.cc_myself }}</li>  </ul>  <hr>  </div>{% endfor%}</body></html>

注意补办标签和模板变量都是我们在views.py的remark方法中声明过的了,所以可以直接的使用。 

初始化数据库

这里使用的是sqlite数据库,在settings.py文件中的配置如下;

# Database# https://docs.djangoproject.com/en/1.9/ref/settings/#databasesDATABASES = {  'default': {    'ENGINE': 'django.db.backends.sqlite3',    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),  }}

然后在terminal 环境下,输入下面的几条命令:

// 创建数据库表结构python manage.py makemigrationspython manage.py migrate// 按照提示进行操作即可,目的是为了创建一个超级管理员python createsuperuser//在自带的开发服务器上运行我们的项目python manage.py runserver

调试验证

这里我们在浏览器下输入
127.0.0.1:8000/admin
就可以看到下面

然后输入127.0.0.1:8000/remark

数据库端:

这样,除了没有美化界面,其余的都完成了呢。

总结

这里虽然是个很简单的小例子,但是我也从中发现了自己的一些概念上的问题,比如说对于模型设计的不合理,因为没有评论时间,这就显得很尴尬了。

然后是

if request.method =="POST":    form = RemarkForm(request.POST)    if form.is_valid():      myremark = Remark()      myremark.subject=form.cleaned_data['subject']      myremark.mail = form.cleaned_data['mail']      myremark.topic = form.cleaned_data['topic']      myremark.message = form.cleaned_data['message']      myremark.cc_myself = form.cleaned_data['cc_myself']      myremark.save()      # return HttpResponse("Publish Success!")  else:    form = RemarkForm()  ctx = {    'form':form,    'ties':Remark.objects.all()  }  return render(request,'message.html',ctx)

这段代码,对应的表单中的action是.这就说明表单提交到了本页面,也就实现了表单数据的评论,这一点很是巧妙。而且使用Django的这一个特点还有一个好处,那就是在不进行手动刷新页面的情况下,仍然可以实现评论的异步加载。

最后,就是模型中Remark模型和RemarkForm表单属性的一致性。这一点应该尤其的注意哦!

好了,今天就介绍到这里吧,由于本人能力一般,代码或者逻辑有错的地方,欢迎大家批评指正!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:

  • Django中的forms组件实例详解
  • Django forms组件的使用教程
  • django中forms组件的使用与注意
  • Python的Django框架中forms表单类的使用方法详解
  • Django forms表单 select下拉框的传值实例
  • Django中Forms的使用代码解析
  • Django的Modelforms用法简介
  • django formset实现数据表的批量操作的示例代码
  • Python的Django框架中的表单处理示例
  • python Django框架实现自定义表单提交
  • django框架forms组件用法实例详解


  • 上一条:
    Python+django实现简单的文件上传
    下一条:
    小小聊天室Python代码实现
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客