2013-07-18 4 views
1

Я использовал флягу раньше, и у меня была проверка формы работы, но по какой-то причине она не работала для моего нового приложения. Вот основной код видапроверка флагов-wtf не работает?

from flask.ext.wtf import Form, TextField, TextAreaField, SubmitField, validators,ValidationError 

class subReddit(Form): 
    subreddit = TextField('subreddit', [validators.Required('enter valid subreddit')]) 
    next = SubmitField('next') 
    change = SubmitField('change') 
    user = TextField('user', [validators.Required('enter valid user')]) 
    fetch = SubmitField('fetch comments') 

Я subreddit в области проверки, так что если его пуст, я хочу, чтобы бросить ошибку и перезагрузите страницу.

Вот HTML

<form class='sub' action="{{ url_for('sr') }}" method='post'> 
        {{ form.hidden_tag() }}      
        <p> 
         if you want to enter more than one subreddit, use the + symbol, like this: 
         funny+pics+cringepics 
        <p> 
        <br/> 
        {% for error in form.subreddit.errors %} 
        <p>{{error}}</p> 
        {% endfor %} 
        {{form.subreddit.label}} 
        {{form.subreddit}} 
        {{form.change}}      

       </form> 

Я CSRF_ENABLED = True в моем routes.py, а также. Что мне не хватает? Когда я оставляю subredditfield пустым и меняет клик, он просто перезагружает страницу, никаких ошибок. Это проблема, потому что все, что находится в поле, будет записано в моей базе данных, и оно не может быть пустым.

EDIT

@app.route('/index',methods=['GET','POST']) 
@app.route('/',methods=['GET','POST']) 
def index(): 
form = subReddit()  
rand = random.randint(0,99) 
sr = g.db.execute('select sr from subreddit')  
srr = sr.fetchone()[0] 
r = requests.get('http://www.reddit.com/r/{subreddit}.json?limit=100'.format(subreddit=srr)) 
j = json.loads(r.content)  
pic = j['data']['children'][rand]['data']['url'] 
title = None 
if form.validate_on_submit(): 
    g.db.execute("UPDATE subreddit SET sr=(?)", [form.subreddit.data])   
    print 'validate ' 
    if j['data']['children'][rand]['data']['url']: 
     print 'pic real'     
     sr = g.db.execute('select sr from subreddit')  
     srr = sr.fetchone()[0] 
     r = requests.get('http://www.reddit.com/r/{subreddit}.json?limit=100'.format(subreddit=srr)) 
     pic = j['data']['children'][rand]['data']['url'] 
     title = str(j['data']['children'][rand]['data']['title']).decode('utf-8') 
     return render_template('index.html',form=form,srr=srr,pic=pic,title=title) 
    else: 
     print 'not valid pic' 
     return render_template('index.html',form=form,srr=srr,pic=pic) 
else: 
    print 'not valid submit' 
    return render_template('index.html',form=form,srr=srr,pic=pic)   
return render_template('index.html',form=form,srr=srr,pic=pic) 
+0

Можете ли вы показать код с точки зрения, которая на самом деле использует форму? –

+0

Я добавлю то, что у меня есть в редактировании, но я возился с ним много, потому что ничего не работает.Когда я ввожу недопустимый субредд, вместо того, чтобы перезагружать страницу или что-то еще, она просто выдает ошибку в переменной pic, потому что она не может получить json из недопустимого sub – gallly

ответ

6

У вас есть ряд проблем.

Наиболее важным является то, что валидация происходит в функции просмотра запроса POST. В вашем примере это функция sr. Эта функция должна создавать объект формы и проверять ее перед добавлением материала в базу данных.

Другая проблема в вашем коде (при условии, что указанная проблема исправлена) заключается в том, что после проверки не удалось перенаправить. Правильно, чтобы сделать шаблон прямо там без перенаправления, потому что сообщения об ошибках, которые были получены после проверки, загружаются в этот экземпляр формы. Если вы перенаправляете, вы теряете результаты проверки.

Кроме того, используйте validate_on_submit вместо validate, так как это избавит вас от необходимости проверить это request.method == 'POST'.

Пример:

@app.route('/sr', methods=['POST'])  
def sr(): 
    form = subReddit() 
    if not form.validate_on_submit(): 
     return render_template('index.html',form=form) 
    g.db.execute("UPDATE subreddit SET sr=(?)", [form.subreddit.data])  
    return redirect(url_for('index')) 

Дополнительных предложения:

  • это обычная практика, чтобы начать свои имена классов с верхним регистром символом. SubReddit лучше, чем subReddit.
  • также распространено, что обработчики запросов GET и POST для страницы, основанной на форме, используют одну и ту же функцию просмотра, поскольку они сохраняют URL-адреса в чистоте, когда проверка не выполняется, без необходимости переходить через обручи для работы перенаправления. Вместо того, чтобы иметь функцию sr отдельно, вы можете просто объединить ее с index() и выполнить действие в форме: url_for('index').
+0

спасибо за эту помощь, я отмечу это как свой ответ, но у меня все еще есть проблемы, которые у меня нет времени, чтобы работать. Надеюсь, скоро я исправлю это, но я обновил свой код, если вы хотите его проверить. – gallly

+1

Это все еще неправильно. Не используйте 'request.form ['subreddit']', вместо этого используйте 'form.subreddit.data'. Кроме того, вместо проверки 'request.method == 'POST'' переместите вызов' validate_on_submit', чтобы занять его место. Вы должны обновлять базу данных только после успешной проверки формы. – Miguel

+0

Я обновил код еще раз, но он не работает. Когда я оставляю поле пустым, выполняется правильный код, и он перезагружает страницу сообщением об ошибке. Но когда я ввожу действительный текст, он все равно не работает? Я не могу получить свой код в form.validate для работы, он просто проигнорирован, потому что form.validate не подбирает правильный текст – gallly

2

Колба-WTF добавляет новый метод на форму под названием validate_on_submit(). Это похоже на метод WTForms validate(), но перехватывает фреймворк для доступа к данным сообщения. Пример, приведенный на сайте Колбы:

form = MyForm() 
if form.validate_on_submit(): 
    flash("Success") 
    return redirect(url_for("index")) 
return render_template("index.html", form=form) 

Поскольку вы используете только проверить(), форма пытается проверить без каких-либо данных (которые, конечно, не получится). Затем вы перенаправляете. Попробуйте использовать validate_on_submit(), как показано выше.

+0

Извините, я не понимаю ваш вопрос. Возможно, отредактируйте ответ с изменением, которое вы сделали? –

Смежные вопросы