如何使用Flask插件视图重用视图和编辑代码

2 投票
1 回答
1645 浏览
提问于 2025-04-17 17:04

我正在参考这里的示例代码:http://flask.pocoo.org/docs/views/#pluggable-views

我觉得这个代码不完整,我无法让它正常工作,也无法在此基础上进行扩展。

我想重用以下功能的代码:

添加数据库条目

@app.route('/add/category/', methods=['GET', 'POST'])
def addCategory():
    form = forms.AddCategory()
    if form.validate_on_submit():
        name = form.name.data
        database.addCategory(name)
        return redirect('/view/categories/')
    return render_template('add-category.html', form = form)


@app.route('/add/revision/', methods=['GET', 'POST'])
def addRevision():
    form = forms.AddRevision()
    if form.validate_on_submit():
        name = form.name.data
        version = form.version.data
        database.addRevision(name, version)
        return redirect('/view/revisions/')
    return render_template('add-revision.html', form = form)

编辑数据库条目

@app.route('/edit/category/<category>', methods=['GET', 'POST'])
def editCategory(category):
    form = forms.AddCategory()
    form.name.data = category
    if form.validate_on_submit():
        newName = form.name.data
        database.editCategory(name = category, newName = newName)
        #view single category?
        return redirect('/view/categories/')
    return render_template('edit-category.html', category = category, form = form)

@app.route('/edit/revision/<name>/<version>', methods=['GET', 'POST'])
def editRevision(name, version):
    form = forms.AddRevision()
    form.name.data = name
    form.version.data = version
    if form.validate_on_submit():
        newName = form.name.data
        newVersion = form.version.data
        database.editRevision(name, version, newName, newVersion)
        return redirect('/view/revisions/')
    return render_template('edit-revision.html', name = name, version = version, form = form)

这是我现在的代码

class ListView(View):
    def get_template_name(self):
        raise NotImplementedError()
    def render_template(self, context):
        return render_template(self.get_template_name(), **context)
    def dispatch_request(self):
        context = {'objects': self.get_objects()}
        return self.render_template(context)

class CategoryView(ListView):
    def get_template_name(self):
        return 'categories.html'
    def get_objects(self):
        return models.Category.query.all()

app.add_url_rule('/categories', view_func=RenderTemplateView.as_view('categories', template_name='categories.html'))

我在哪里指定在app.add_url_rule中使用CategoryView类呢?

1 个回答

2

这个问题在于文档在这两个代码块之间切换了上下文——第二组示例使用的 RenderTemplateView 并不是要和前面的 ListView 相关联。

app.add_url_rule('/categories', view_func=RenderTemplateView  # ... snip ...

应该是:

app.add_url_rule('/categories', view_func=CategoryView.as_view("category"))

这段代码 创建了一个函数,当这个函数被调用时,会创建一个你的 CategoryView 的实例,并调用它的 dispatch_request 方法。

撰写回答