博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
阅读量:5996 次
发布时间:2019-06-20

本文共 5715 字,大约阅读时间需要 19 分钟。

Blog 项目源码:

目录

前文列表

实现 post() 视图函数

  • views.py
    在原有的基础上对视图函数 post() 进行修改.
from uuid import uuid4import datetimefrom forms import CommentForm@app.route('/post/
', methods=('GET', 'POST'))def post(post_id): """View function for post page""" # Form object: `Comment` form = CommentForm() # form.validate_on_submit() will be true and return the # data object to form instance from user enter, # when the HTTP request is POST if form.validate_on_submit(): new_comment = Comment(id=str(uuid4()), name=form.name.data) new_comment.text = form.text.data new_comment.date = datetime.datetime.now() new_comment.post_id = post_id db.session.add(new_comment) db.session.commit() post = Post.query.get_or_404(post_id) tags = post.tags comments = post.comments.order_by(Comment.date.desc()).all() recent, top_tags = sidebar_data() return render_template('post.html', post=post, tags=tags, comments=comments, form=form, recent=recent, top_tags=top_tags)

NOTE: CommentForm 类是在 中定义的, 需要将其导入到该模块中.

  • 需要在视图函数 post() 中添加接收 HTTP POST 请求, 路由方法 route() 默认只接收 HTTP GET 请求.

  • 在视图函数中创建一个 form 对象, 并以此来获取用户在输入框中输入的数据对象.

  • form.validata_on_submit() 方法会隐式的判断该 HTTP 请求是不是 POST, 若是, 则将请求中提交的表单数据对象传入上述的 form 对象并进行数据检验.

  • 若提交的表单数据对象通过了 form 对象的检验, 则 form.validata_on_submit() 返回为 True 并且将这些数据传给 form 对象, 成为其实例属性.

  • 之后我们就能够通过表单对象 form 来调用其实例属性, 并且赋值给 models 对象, 最后存入到数据库中.

  • 最后, 因为在 post.html 页面需要显示这些评论, 所以该模板文件也需要传入 form 对象含有的实例属性值, 那么我们直接在视图函数 post() 中 直接将 form 对象传入到 render_template() 就好了.

在 post.html 中添加表单

{% extends "base.html"%}{% block title %}{
{ post.name }}{% endblock %}
{% block body %}

{
{ post.title }}

{
{ post.publish_date }}:{
{ post.text }}

New Comment:

{
{ form.hidden_tag() }}
{
{ form.name.label }} {% if form.name.errors %} {% for e in form.name.errors %}

{

{ e }}

{% endfor %} {% endif %} {
{ form.name(class_="form-control") }}
{
{ form.text.label }} {% if form.text.errors %} {% for e in form.text.errors %}

{

{ e }}

{% endfor %} {% endif %} {
{ form.text(class_='form-control') }}
{% endblock %}
  • form.hidden_tag(): 提供了预防跨站请求伪造的机制, 常用于表单页面
  • field.errors: 列表类型, 用于显示验证失败后的提示信息
  • {
    { form.name(class_="form-control") }}
    : 把字段本身作为方法调用, 会渲染作用于该字段的的 HTML 代码.
  • field.label: 为输入框生成对应的 label 标签的 HTML 代码.

效果

这里写图片描述

查看是否写入到了数据库:

mysql> select * from comments where name='jmilkfan';+--------------------------------------+----------+------+---------------------+--------------------------------------+| id                                   | name     | text | date                | post_id                              |+--------------------------------------+----------+------+---------------------+--------------------------------------+| 0cea03ec-76b4-4ba4-b781-6a0bf056078b | jmilkfan | HI   | 2016-11-25 17:21:05 | 35c8b4f3-c231-4b32-b139-f7647714b87e |+--------------------------------------+----------+------+---------------------+--------------------------------------+1 row in set (0.00 sec)

ERROR LOG:

(env)fanguiju@fanguiju:/opt/JmilkFan-s-Blog$ python manage.py server/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.script is deprecated, use flask_script instead.  .format(x=modname), ExtDeprecationWarning/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.migrate is deprecated, use flask_migrate instead.  .format(x=modname), ExtDeprecationWarning/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.sqlalchemy is deprecated, use flask_sqlalchemy instead.  .format(x=modname), ExtDeprecationWarning/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')Traceback (most recent call last):  File "manage.py", line 35, in 
manager.run() File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run result = self.handle(sys.argv[0], sys.argv[1:]) File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle res = handle(*args, **config) File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_script/commands.py", line 425, in __call__ **self.server_options) File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/app.py", line 843, in run run_simple(host, port, self, **options) File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/werkzeug/serving.py", line 677, in run_simple s.bind((hostname, port)) File "/usr/lib/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args)socket.error: [Errno 98] Address already in use

TSG: 在该运行的环境中, Server() 默认的 IP 或 PORT 被占用了. 所以在 manage.py 中手动的设定其 IP 或 PORT.

manager.add_command("server", Server(host='127.0.0.1', port=8089))

转载于:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589864.html

你可能感兴趣的文章
yum仓库的创建
查看>>
howto dig
查看>>
关于linux-gpg数据加密详细配置
查看>>
学习FPGA绝佳网站推荐
查看>>
文件行去重
查看>>
Oracle的id自增长的两种方式
查看>>
我的友情链接
查看>>
oracle权限数据字典分析
查看>>
MYSQL-默认用户
查看>>
翻译是一份严谨的工作——关于HTTP中文翻译的讨论
查看>>
CentOS 6.7实战部署SSHKey
查看>>
设计模式学习笔记(3)——抽象工厂模式
查看>>
linux系统初始化--修改主机名
查看>>
初识JVM
查看>>
rsync服务同步、日志文件、screen工具
查看>>
我的友情链接
查看>>
C++多线程
查看>>
mysql查看binlog日志内容
查看>>
MYSQL-触发器
查看>>
IE中导出excel的时候,显示乱码
查看>>