烧瓶 - WTForm - 保存表格到数据库 [英] Flask - WTForm - save form to db

查看:146
本文介绍了烧瓶 - WTForm - 保存表格到数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有保存表单(wtf)到(sqlalchemy)db的问题,表单正在呈现,但是在提交之后什么也没有发生...... 例如.b
$ b

  127.0.0.1  -   -  [30 / Dec / 2013 10:30:24]POST / add / HTTP / 1.1 200  -  

我正试图保存没有验证器

例如:

  name = TextField('Task Name')

我试图以另一种方式保存表格:

  if request。方法=='POST'和form.validate():
new_task =任务(
form.name.data,
form.due_date.data,
form.priority.data ,
form.posted_date.data,
session ['user_id'],
form.category.data,
form.super_category.data,
form.description。数据

db.session.add(new_task)
db.session.commit()

和下面的代码:

模型:

 # -  *  -  coding:utf-8; -  *  -  

从应用程序导入db
导入日期时间


类任务(db.Model):

__tablename__ =tasks

task_id = db.Column(db.Integer,primary_key = True)
name = db.Column(db.String(255),nullable = False)$ b $ (db.text,nullable = False)
priority = db.Column(db.Integer,nullable = False)
posted_date = db.Column(db.DATE,nullable = False )
status = db.Column(db.Integer,default = 1,nullable = False)
category = db.Column(db.String(255),nullable = False)
super_category = db.Column(db.String(255),nullable = False)
user_id = db.Column(db.Integer,db.ForeignKey('users.id'))

def __init__ (self,name,due_date,priority,posted_date,users_id,category,super_category,description):
self.name = name
self.due_date = due_date $ b $ self.priority = priority
self.posted_date = posted_date
self.user_id = users_id
self.category = category
self.super_category = super_category
self.description = description



<

 # -  *  -  coding:utf-8; -  *  - 从wtforms进口的
从wtforms导入表格,验证器
从wtforms导入TextField,DateField,IntegerField,SelectField,TextAreaField
import required,Email,EqualTo,Length
from wtforms import PasswordField
$ b $ class AddTask(Form):
name = TextField('Task Name',validators = [required()])
due_date = DateField('Date Due (),validators = [required()],format ='%m /%d /%Y')
priority = SelectField('Priority',validators = [required() = [( '1', '1'),( '2', '2'),( '3', '3'),( '4', '4'),( '5', '5' )])
description = TextAreaField('Description',validators = [required()])
posted_date = DateField('Date Date(mm / dd / yyyy)',validators = [required()] ,格式='%m /%d /%Y')
category = SelectField('Category',validators = [required()],choices = [('foobar','foobar'),('foobar2 ','foobar2')])
super_category = SelectField('Super_category',validators = [re (''foobar3','foobar4'),('foobar5','foobar5'))
user_id = SelectField('User' ,验证器= [需要()],选择= [( '1', '1'),( '2', '2'),( '3', '3'),( '4', '4' ),('5','5')])

views:

  @ app.route('/ add /',methods = ['GET','POST'])
@login_required
$ def new_task():
form = AddTask(request.form,csrf_enabled = True)
if request =='POST'and form.validate():
form_tasks = Tasks()
form.populate_obj(form_tasks)
db.session.add(form_tasks)
db.session.commit()
返回重定向(url_for('tasks'))
返回render_template('form.html',form = form)

form.html:

  {%extendslayout2.html%} 
{%from'common.html'import edit_field%}
{%block content%}
& lt; div class ='edit well offset 2 span8'>
< form method ='post'class =form-horizo​​ntal>
<图例>添加任务< /图例>
{{edit_field(form.name,class =span3)}}
{{edit_field(form.due_date,class =span3,type =datetime)}}
{{edit_field(form.priority,class =span3)}}
{{edit_field(form.description,rows =5,class =span3,placeholder =foobar)}}
{{edit_field(form.posted_date,class =span3,type =datetime)}}
{{edit_field(form.category,class =span3)}}
{ edit_field(form.super_category,class =span3)}}
< div class =form-actions>
< button type =submitclass =btn> SAVE< / button>
< / div>
< / form>
< / div>
{%endblock%}

common.html:

  {%macro edit_field(field,catch_kwargs = true)%} 
< div class =control-group {%if field.errors%}错误{%endif%}>
{{field.label(class =control-label)}}
< div class =controls>
{{field(** kwargs)}}
{%for field.errors%中的错误}
< span class =help-inline> {{error}}< ; /跨度>
{%endfor%}
< / div>
< / div>
{%endmacro%}


解决方案

把防伪标记放在表格的某处。
在模板文件中,在form标签内添加以下内容:

  {{form.hidden_​​tag()}} 

隐藏字段类似于

 < input id =csrf_tokenname =csrf_tokentype =hiddenvalue =xxxxxx> 

将它与 form.html 我们得到的文件:

  {%extendslayout2.html%} 
{%from'common.html 'import edit_field%}
{%block content%}
< div class ='edit well offset 2 span8'>
< form method ='post'class =form-horizo​​ntal>
{{form.hidden_​​tag()}}
< legend>添加任务< / legend>
{{edit_field(form.name,class =span3)}}
{{edit_field(form.due_date,class =span3,type =datetime)}}
{{edit_field(form.priority,class =span3)}}
{{edit_field(form.description,rows =5,class =span3
,placeholder =foobar) }}
{{edit_field(form.posted_date,class =span3,type =datetime)}}
{{edit_field(form.category,class =span3)}}
{{edit_field(form.super_category,class =span3)}}
< div class =form-actions>
< button type =submitclass =btn> SAVE< / button>
< / div>
< / form>
< / div>
{%endblock%}


I have problem with saving form (wtf) to (sqlalchemy) db ,form is rendering ,but after submit nothing happens ...

e.g. :

127.0.0.1 - - [30/Dec/2013 10:30:24] "POST /add/ HTTP/1.1" 200 -

I was trying to save without validators

e.g. :

name = TextField('Task Name')

and i was trying to save form other way :

if request.method == 'POST' and form.validate():
            new_task = Tasks(
                         form.name.data,
                         form.due_date.data,
                         form.priority.data,
                         form.posted_date.data,
                         session['user_id'],
                         form.category.data,
                         form.super_category.data,
                         form.description.data
                        )
            db.session.add(new_task)
            db.session.commit()  

And code below :

models :

# -*- coding: utf-8; -*-

from app import db
import datetime


class Tasks(db.Model):

    __tablename__ = "tasks"

    task_id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(255),nullable=False)
    description = db.Column(db.Text,nullable=False)
    priority = db.Column(db.Integer,nullable=False)
    posted_date = db.Column(db.DATE,nullable=False)
    status = db.Column(db.Integer,default=1,nullable=False)
    category = db.Column(db.String(255),nullable=False)
    super_category = db.Column(db.String(255),nullable=False)
    user_id = db.Column(db.Integer,db.ForeignKey('users.id'))

    def __init__(self,name,due_date,priority,posted_date,users_id,category,super_category,description):
        self.name = name
        self.due_date = due_date
        self.priority = priority
        self.posted_date = posted_date
        self.user_id = users_id
        self.category = category
        self.super_category = super_category
        self.description = description

forms :

 # -*- coding: utf-8; -*-
from wtforms import Form,validators
from wtforms import TextField,DateField,IntegerField,SelectField,TextAreaField
from wtforms.validators import required,Email,EqualTo,Length
from wtforms import PasswordField

class AddTask(Form):
  name = TextField('Task Name',validators=[required()])
  due_date = DateField('Date Due (mm/dd/yyyy)',validators=[required()],format='%m/%d/%Y')
  priority = SelectField('Priority',validators=[required()],choices=[('1','1'),('2','2'),('3','3'),('4','4'),('5','5')])
  description = TextAreaField('Description',validators=[required()])
  posted_date = DateField('Posted Date (mm/dd/yyyy)',validators=[required()],format='%m/%d/%Y')
  category = SelectField('Category',validators=[required()],choices=[('foobar','foobar'),('foobar2','foobar2')])
  super_category = SelectField('Super_category',validators=[required()],choices=[('foobar3','foobar3'),('foobar4','foobar4'),('foobar5','foobar5')])
  user_id = SelectField('User',validators=[required()],choices=[('1','1'),('2','2'),('3','3'),('4','4'),('5','5')])

views :

@app.route('/add/',methods=['GET','POST'])
@login_required
def new_task():
    form = AddTask(request.form,csrf_enabled=True)
    if request == 'POST' and form.validate():
        form_tasks = Tasks()
        form.populate_obj(form_tasks)
        db.session.add(form_tasks)
        db.session.commit()
        return redirect(url_for('tasks'))
    return render_template('form.html',form=form)

form.html :

{% extends "layout2.html" %}
{% from 'common.html' import edit_field %}
{%  block content %}
<div class='edit well offset 2 span8'>
  <form method='post' class="form-horizontal">
    <legend> Add task </legend>
        {{ edit_field(form.name , class="span3") }}
        {{ edit_field(form.due_date , class="span3", type="datetime") }}
        {{ edit_field(form.priority, class="span3") }}
        {{ edit_field(form.description, rows="5" ,class="span3", placeholder="foobar" ) }}
        {{ edit_field(form.posted_date, class="span3",type="datetime") }}
        {{ edit_field(form.category, class="span3") }}
        {{ edit_field(form.super_category, class="span3") }}
<div class="form-actions">
<button type="submit" class="btn">SAVE</button>
</div>
</form>
</div>
{%  endblock    %}

common.html :

{% macro edit_field(field,catch_kwargs=true) %}
<div class="control-group{% if field.errors  %} error {% endif %}">
    {{  field.label(class="control-label") }}
<div class="controls">
    {{  field(**kwargs)  }}
    {% for error in field.errors %}
    <span class="help-inline">{{error}}</span>
    {% endfor %}
</div>
</div>
{% endmacro %}

解决方案

You need to put anti-forgery token somewhere within the form. Add the following in your template file, inside the form tag:

{{ form.hidden_tag() }}

This renders hidden field similar to

<input id="csrf_token" name="csrf_token" type="hidden" value="xxxxxx">

Putting it together with your form.html file we are getting:

{% extends "layout2.html" %}
{% from 'common.html' import edit_field %}
{% block content %}
<div class='edit well offset 2 span8'>
    <form method='post' class="form-horizontal">
        {{ form.hidden_tag() }}
        <legend>Add task</legend>
        {{ edit_field(form.name , class="span3") }}
        {{ edit_field(form.due_date , class="span3", type="datetime") }}
        {{ edit_field(form.priority, class="span3") }}
        {{ edit_field(form.description, rows="5" ,class="span3"
                     , placeholder="foobar" ) }}
        {{ edit_field(form.posted_date, class="span3",type="datetime") }}
        {{ edit_field(form.category, class="span3") }}
        {{ edit_field(form.super_category, class="span3") }}
        <div class="form-actions">
            <button type="submit" class="btn">SAVE</button>
        </div>
    </form>
</div>
{% endblock %}

这篇关于烧瓶 - WTForm - 保存表格到数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆