Как можно распечатать ввод из flask-WTForm в html с помощью SQLALCHEMY

Я следую учебнику Flask-WTF

Теперь мой вопрос: как я могу отобразить ввод, который пользователь вводит в contact.html, и отобразить его в info.html с помощью SQLALCHEMY? Я использую form.populate_obj(), но не знаю, работает он или нет, и это то, что я делал до сих пор. информация.html

#this is routs.py
from flask import Flask, render_template, url_for, request, flash
from form import LoginForm 
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask (__name__)
app.secret_key = 'pegahpegah'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////test.db'
db = SQLAlchemy(app)

@app.route('/')
def home():
return render_template('home.html')

@app.route('/about')
def about():
return render_template('about.html')

@app.route('/contact', methods=['GET', 'POST'])
def contact():
form = LoginForm()
if request.method == 'POST':
    if form.validate()== True:
    newcontact = Contact(name=form.name,
                              email=form.email,
                              subject=form.subject,
                              message=form.message)
    try:
        db.session.add(newcontact)
        db.session.commit()
        flash('Contact commited to database')
        return redirect(flask.url_for('info'))
   except:
        #Something went wrong when trying to add to the database.
        flash('Could not commit new contact') 
    else: #If the form does not have all fields that are required 
        flash('All fields are required.')
 return render_template('contact.html', form=form)

@app.route('/info', methods=['GET', 'POST'])
def info():
  form = LoginForm()
  contactinfo = Contact.query.first()
  #Populate the form
  form.name = contactinfo.name
  form.email = contactinfo.email
  form.subject = contactinfo.subject
  form.message = contactinfo.message
  #returns the html page, along with the form        
  return render_template('info.html', form=form)

 if __name__ == '__main__':
 app.run(debug=True)    

form.py

 from flask.ext.wtf import Form
 from wtforms import StringField, SubmitField, validators, ValidationError
 from wtforms.validators import DataRequired

 class LoginForm(Form):
     name = StringField("Name", [validators.Required("Please enter your name.")])
     email = StringField("Email", 
     [validators.Required("Please enter your email  address."),
     validators.Email("Please enter valid email address.")])
     subject = StringField("Subject", 
     [validators.Required("Please enter your subject.")])
     message = StringField("Message", 
     [validators.Required("Please enter your  message.")])
     submit = SubmitField("Submit")

модель.py

from flask.ext.sqlalchemy import SQLAlchemy
from routs import db


class Contact(db.Model):
  __tablename__ = "Contact"
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(50))
    email = db.Column(db.String(50))
    subject = db.Column(db.String(50))
    message = db.Column(db.String(50))


   def __init__(self, name, email, subject, ):
       self.name = name
       self.email = email
       self.subject = subject
       self.message = message

   def __repr__(self):
       return '<ContactForm %r>' % (self.message)

информация.html

     {% extends "layout.html" %}
     {% block content %}
    <h2>show the info</h2>
      {% for entry in form %}
         <strong>name:</strong> {{ entry.name}} <br>
         <strong>email:</strong> {{ entry.email }} <br>
         <strong>subject</strong> {{ entry.subject }} <br>
         <strong>messaget</strong> {{ entry.message }} <br>
        <br>
       {% endfor %}
  {% endblock %}

контакт.html

   {% extends "layout.html" %}
   {% block content %}
   <h2>Contact</h2>

   {% for message in form.name.errors %}
   <div class="flash">{{ message }}</div>
   {% endfor %}

   {% for message in form.email.errors %}
   <div class="flash">{{ message }}</div>
   {% endfor %}

   {% for message in form.subject.errors %}
   <div class="flash">{{ message }}</div>
   {% endfor %}

   {% for message in form.message.errors %}
    <div class="flash">{{ message }}</div>
   {% endfor %}

  <form action="{{url_for('contact')}}" method=post>
    {{ form.hidden_tag() }}

    {{ form.name.label }}
    {{ form.name }}

    {{ form.email.label }}
    {{ form.email }}

    {{ form.subject.label }}
    {{ form.subject }}

    {{ form.message.label }}
    {{ form.message}}

    {{form.submit}}
  </form>  

 {% endblock %}

когда я нажимаю «Отправить», и все формы действительны, ничего не происходит, и он не ведет к информации, и не показывает флэш-память, и если я пытаюсь открыть info.html AttributeError

AttributeError: тип объекта «LoginForm» не имеет атрибута «запрос»


person Community    schedule 08.12.2014    source источник
comment
Пожалуйста, исправьте код, я уверен, что многое упустил....   -  person    schedule 09.12.2014
comment
Никто не будет отлаживать весь этот код за вас, это не то, о чем stackoverflow. Пожалуйста, четко представьте проблему, с которой вы боретесь, а не весь код, если только он не представляет особого интереса для всех, кто может прочитать вопрос. Вы должны правильно определить, чего вы пытаетесь достичь, и где вы застряли. а   -  person GG_Python    schedule 09.12.2014
comment
Мне кажется, что вам нужно получить базовое представление о вашем коде. В ваших контактах вы ничего не делаете с формой, вы, вероятно, должны хранить ее в БД. В информации вы должны прочитать из БД, заполнить форму полученной информацией, а затем показать ее пользователю. И вы должны отформатировать свой код, прежде чем публиковать вопрос.   -  person Zyber    schedule 09.12.2014
comment
@Zyber @ GG_Python Спасибо за ваши комментарии, мне было нелегко с этим кодом, я буду признателен, если вы поможете мне, я редактирую код, добавляю комментарии к частям, которые, как мне кажется, могут вызвать проблемы.   -  person    schedule 11.12.2014


Ответы (1)


Надеюсь, этот код даст вам рабочий подход. Я добавил комментарии, которые, надеюсь, прояснят, что происходит.

@app.route('/contact', methods=['GET', 'POST'])
def contact():
   form = ContactForm()
   print('ContactForm created')
   if request.method == 'POST':
      print('Entered Post')
      if form.validate_on_submit:  #If the form contains all required fields
         print('Form validated')
         #Create a new contact and commit it to the db.
         newcontact = Contact(name=form.name.data,
                              email=form.email.data,
                              subject=form.subject.data,
                              message=form.message.data)
         try:
            print('Trying to add newcontact')
            db.session.add(newcontact)
            print('contact added')
            db.session.commit()
            print('contact commited')
            flash('Contact commited to database')
            return redirect(flask.url_for('info')) 
         except:
            print('Exception')
            #Something went wrong when trying to add to the database.
            flash('Could not commit new contact') 
      else: #If the form does not have all fields that are required 
         print('Entered else')
         flash('All fields are required.')
   print('Return')
   return render_template('contact.html', form=form)

 @app.route('/info', methods=['GET', 'POST'])
 def info():
    form = ContactForm()
    #Fetch the first contact from db.
    contactinfo = Contact.query.first()
    #if you want to fetch a specific contact you need to specify it like this,
    #contactinfo = Contact.query.filter_by(name='somenamehere').first()

    #Populate the form
    form.name.data = contactinfo.name
    form.email.data = contactinfo.email
    form.subject.data = contactinfo.subject
    form.message.data = contactinfo.message
    #returns the html page, along with the form        
    return render_template('info.html', form=form)

{% extends "layout.html" %}
  {% block content %}
     <h2>show the info</h2>
        {% for entry in form %}
           <strong>name:</strong> {{ entry.name}} <br>
           <strong>email:</strong> {{ entry.email }} <br>
           <strong>subject</strong> {{ entry.subject }} <br>
           <strong>messaget</strong> {{ entry.message }} <br>
          <br>
        {% endfor %}
  {% endblock %}

---forms.py--
from flask_wtf import Form
from wtforms import StringField
from wtforms.validators import DataRequired

class ContactForm(Form):
    name = StringField('name', validators=[DataRequired()])
    email = StringField('email', validators=[DataRequired()])
    subject = StringField('subject', validators=[DataRequired()])
    message = StringField('message', validators=[DataRequired()])

--models.py--
from flask.ext.sqlalchemy import SQLAlchemy
from routs import db

class Contact(db.Model):
   __tablename__ = "Contact"
   id = db.Column(db.Integer, primary_key = True)
   name = db.Column(db.String(50))
   email = db.Column(db.String(50))
   subject = db.Column(db.String(50))
   message = db.Column(db.String(50))

В html мы будем перебирать данные, которые мы получаем в форме, и для каждой записи мы будем печатать информацию. ПРИМЕЧАНИЕ. В моем примере вы всегда будете извлекать первую контактную информацию из БД и, следовательно, всегда будете получать один и тот же контакт, а также только ОДИН контакт.

Изменить: в Forms.py мы создали форму, которая будет использоваться на странице контактов. Форма определяет необходимые поля и структуру формы. В models.py мы определили модель, представляющую контактную запись в базе данных. Это означает, что в вашей базе данных должна быть таблица с именем Contact.

person Zyber    schedule 11.12.2014
comment
Думаю, мне следует импортировать контакт в routs.py, иначе это будет ошибка NameError: глобальное имя «Контакт» не определено. Поэтому я поставил его после db = SQLAlchemy(app) снова ничего не работает, и если я попытаюсь открыть info.html ошибка жирный sqlalchemy.exc.InvalidRequestError @Zyber – - person ; 11.12.2014
comment
В любом случае, спасибо за вашу помощь @Zyber - person ; 11.12.2014
comment
Наконец, я мог создать базу данных и подключить таблицу к базе данных. Но теперь флэш-память все еще не работает, и она не направляет ее в info.html, и когда я открываю info.html AttributeError: объект «NoneType» не имеет атрибута «имя» форма.имя = contactinfo.name не могли бы вы помочь, пожалуйста? @Зибер - person ; 12.12.2014
comment
Когда вы пытаетесь открыть info.html, вы получаете ошибку своего атрибута. Это означает, что вы ничего не получаете из своего запроса к базе данных, он не может найти контакт в базе данных. Я предполагаю, что это потому, что когда вы пытаетесь добавить контакт в свою базу данных (в contact.html), это не удается. Для вашей первой ошибки трудно сказать, в чем проблема, поскольку вы не предоставляете никакой прямой информации. Попробуйте добавить несколько отпечатков, чтобы узнать, что происходит. Нам нужно выяснить, какая строка вызывает проблему. Проверьте мой отредактированный код @Pegasuss - person Zyber; 12.12.2014
comment
Убедитесь, что вы используете .data в правильных местах, как в информации, так и в контактах. Сравните с моим кодом и внесите необходимые изменения, чтобы он выглядел как мой. Если это не сработает, укажите свой текущий код в своем вопросе. @Pegasuss - person Zyber; 12.12.2014