Как обновить значение данных элемента формы после построения, используя multidict - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть создатель / редактор поста на сайте, который я пишу.Я успешно смог создать пост (сохраняет в json), получить выпадающий список меню созданного поста из той же базы данных (и во-вторых, все posts.json, откуда берется список постов), изаполнить формы элементов указанной информацией.Затем я могу сохранить его, и он действительно записывает в файл.Проблема в том, что данные в текстовых полях не обновляются в сохраненном сообщении.Сохраняет исходные данные, переданные с мультидиктом.Я могу вручную обновить его как: Ex.form.title.data = "Новый заголовок", и он сохраняется как таковой, поэтому я знаю, что он правильно обрабатывает все в конце сохранения.Если у кого-то есть идея, как получить обновленную информацию из полей формы, будьте благодарны.Спасибо.

Конструкторы в строке 103 Код: https://hastebin.com/lafavifike.py

from flask import Flask, render_template, request, flash, redirect, url_for
from QFlask import QFlask
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
from wtforms.fields import Field, TextAreaField, TextField, SelectField
from wtforms.widgets import TextArea
import os, json
from werkzeug.datastructures import MultiDict

app = Flask(__name__)
app.config['SECRET_KEY'] = "test"

class editPostForm(FlaskForm):
    id_pos = ['blog_posts', 'security_posts', 'game_posts','music_posts','project_posts']
    file_path_all = str(os.getcwd()) + "\\static\\allposts.json"
    with open(file_path_all, 'r') as post_edit:
            all_posts = json.load(post_edit)
            posts = [('default', 'Choose Post To Edit')]
            for key in all_posts.keys():
                if key not in id_pos:
                    posts.append((all_posts[key]['id'], all_posts[key]['title']))
    loadform = SelectField('Choose Post', choices=posts)
    loadposts = SubmitField('Load')

class PostForm(FlaskForm): 
    #Actual form fields     
    categories = [('blog_posts','Blog Post'), ('security_posts','Security Post'),('game_posts','Games Post'),('music_posts','Music Post'),('project_posts','Projects Post')]
    category = SelectField('Category', choices = categories, validators = [DataRequired()])
    title = StringField('Title', validators=[DataRequired()])
    date = StringField('Date', validators=[DataRequired()])
    content = TextAreaField('Content', validators=[DataRequired()], widget=TextArea())
    submit = SubmitField('Submit')

@app.route('/', methods=['POST', 'GET'])
def index():
    file_path = str(os.getcwd()) + "\\static\\posts.json"
    with open(file_path, 'r+') as post_edit:
        data = json.load(post_edit)
        positions = {}
        for key in data['id_pos'].keys():
            positions[key] = data['id_pos'][key]

    #Create Post Form
    prefixs = {'1':'blog_posts','2':'security_posts',"3":"game_posts","4":"music_posts","5":"project_posts"}
    form = PostForm()
    edit_form = editPostForm()

    if request.method == 'POST':
        print(edit_form.loadform.data)
        if edit_form.loadform.data != 'None':
            return redirect('/edit_post/'+ edit_form.loadform.data)
        else:
            form.validate()
            category = form.category.data
            title = form.title.data
            date = form.date.data
            content = form.content.data
            post_id = str(int(positions[category]) +1)
            post = {
                "id": post_id,
                "title": title,
                "date": date,
                "content": content
            }

            #Update data structure, and save back to the file
            data['id_pos'][category] = post_id
            data[category][post_id] = post
            #SAVE POST
            data['index_posts'][post_id] = post
            with open(file_path, 'w') as post_edit:
                json.dump(data, post_edit)
                print('Post Saved')
                flash('Post Saved')
            file_path_all = str(os.getcwd()) + "\\static\\allposts.json"
            with open(file_path_all, 'r+') as file:
                data = json.load(file)
            with open(file_path_all, 'w') as file:
                data[post_id] = post
                json.dump(data, file)
            return redirect(url_for('index'))

    return render_template('post_editor.html', title="Post Creator", form=form, edit_form = edit_form)

@app.route('/edit_post/<id>', methods=['GET','POST'])
def edit_post(id):
    #Load data from JSON Files. posts= categorized posts, allposts is all posts key'd by id.
    file_path_all = str(os.getcwd()) + "\\static\\allposts.json"
    file_path = str(os.getcwd()) + "\\static\\posts.json"
    with open(file_path, 'r+') as post_edit:
        data = json.load(post_edit)
    with open(file_path_all, 'r') as post_edit:
        all_posts = json.load(post_edit)
        posts = [('default', 'Choose Post To Edit')]
        for key in all_posts.keys():
            posts.append((all_posts[key]['id'], all_posts[key]['title']))

    #Auto filling category and data for fields
    prefixs = {'1':'blog_posts','2':'security_posts',"3":"game_posts","4":"music_posts","5":"project_posts"}
    category = prefixs[id[0]]
    form = PostForm(MultiDict([("id", id),("title", data[category][str(id)]['title']) ,("date", data[category][str(id)]['date']),("content" , data[category][str(id)]['content'])]))


    if request.method == "POST":
        form.validate()
        data[category][str(id)] = {
            'id': str(id),
            'title': form.title.data,
            'date': form.date.data,
            'content': str(form.content.data)
        }
        all_posts[str(id)] = {
            'id': str(id),
            'title': form.title.data,
            'date': form.date.data,
            'content': str(form.content.data)
        }
        #Write to file.
        print('Saving the edited post..')
        with open(file_path_all, 'w') as file:
            json.dump(all_posts,file)
            print('File Saved ') 
        with open(file_path, 'w') as file:
            json.dump(data,file)
            flash('File Saved')
            return redirect('/')

    return render_template('edited_post.html', title="Post Editor", form = form)
if __name__ == '__main__':

    QFlask(app).run(title="Web Post Editor", zoom=0,  width=600, height= 600)
posteditor.html
    <html>
        <head><title> Post Editor</title>
            <style src="{{url_for('static', filename='css/bootstrap.min.css')}}"></style>
            <style>
                pre{
                    content-align: left;
                }
                body{
                    color: grey;
                    background-image: url({{url_for('static', filename='img/editor-bg.jpg')}});
                }
            </style>
            <script src="{{url_for('static', filename='js/jquery.min.js')}}"></script>
            <script src="{{url_for('static', filename='js/popper.js')}}"></script>
            <script src="{{url_for('static', filename='js/bootstrap.min.js')}}"></script>
        </head>
        <body>
                <div class="container">
                    {% with message = get_flashed_messages()%}
                    <ul class="flashes">
                        {{message}}
                    </ul>
                    {% endwith%}
                    {{ form.csrf_token }}
                    <form method="POST" action="" id="selection">
                            <fieldset class="form-group">
                            <div class="form-group">
                                    {{edit_form.loadform.label(class="form-control-label")}}
                                    {{ edit_form.loadform(class="form-control form-control-lg")}}
                            </div>
                            <div class="form-group">
                                    {{ edit_form.loadposts(class="btn btn-outline-info")}}
                            </div> 
                            </fieldset>
                    </form>
                    <form method="POST" action="">
                            <fieldset class="form-group">
                            <div class="form-group">
                                    {{ form.category.label(class="form-control-label")}}
                                    {{ form.category(class="form-control form-control-lg")}}
                            </div>
                            <div class="form-group">
                                    {{ form.title.label(class="form-control-label")}}
                                    {{ form.title(class="form-control form-control-lg")}}
                                </div>
                                <div class="form-group">
                                        {{ form.date.label(class="form-control-label")}}
                                        {{ form.date(class="form-control form-control-lg")}}
                                </div>
                                <div class="form-group">
                                        {{ form.content.label(class="form-control-label")}}
                                        {{ form.content(cols="50", rows="20",class="form-control form-control-lg")}}
                                </div>
                                <div class="form-group">
                                        {{ form.submit(class="btn btn-outline-info") }}
                                </div>
                            </fieldset>
                    </form>

                </div>
        </body>
    </html>
editedpost.html:

    <html>
        <head><title> Post Editor</title>
            <style src="{{url_for('static', filename='css/bootstrap.min.css')}}"></style>
            <style>
                pre{
                    content-align: left;
                }
                body{
                    color: grey;
                    background-image: url({{url_for('static', filename='img/editor-bg.jpg')}});
                }
            </style>
            <script src="{{url_for('static', filename='js/jquery.min.js')}}"></script>
            <script src="{{url_for('static', filename='js/popper.js')}}"></script>
            <script src="{{url_for('static', filename='js/bootstrap.min.js')}}"></script>
        </head>
        <body>
                <div class="container">
                    {% with message = get_flashed_messages()%}
                    <ul class="flashes">
                        {{message}}
                    </ul>
                    {% endwith%}


                    <form method="POST" action="">
                            {{ form.csrf_token }}
                            <fieldset class="form-group">
                            <div class="form-group">
                                    {{ form.category.label(class="form-control-label")}}
                                    {{ form.category(class="form-control form-control-lg")}}
                            </div>
                            <div class="form-group">
                                    {{ form.title.label(class="form-control-label")}}
                                    {{ form.title(class="form-control form-control-lg")}}
                                </div>
                                <div class="form-group">
                                        {{ form.date.label(class="form-control-label")}}
                                        {{ form.date(class="form-control form-control-lg")}}
                                </div>
                                <div class="form-group">
                                        {{ form.content.label(class="form-control-label")}}
                                        {{ form.content(cols="50", rows="20",class="form-control form-control-lg")}}
                                </div>
                                <div class="form-group">
                                        {{ form.submit(class="btn btn-outline-info") }}
                                </div>
                            </fieldset>
                    </form>

                </div>
        </body>
    </html>

1 Ответ

0 голосов
/ 22 февраля 2019

Я нашел ответ (с помощью некоторых сотрудников IRC). Проблема заключалась в том, что данные формы всегда извлекались из инициализированной версии.Он никогда не запрашивал обновление со страницы.в data [category] [str (id)] =, значения должны обновляться через request.form.get ('title')

...