将联系页面添加到Flask Admin

3
我正在开发一个Flask-Admin项目,想要添加一个联系我们页面。我正在按照https://code.tutsplus.com/tutorials/intro-to-flask-adding-a-contact-page--net-28982上的示例进行操作。
问题在于该示例是针对Flask设计的,而我的所有模板都基于Flask-Admin模板。
@app.route('/contact', methods=['GET', 'POST'])
def contact():
  form = ContactForm()

  if request.method == 'POST':
    if form.validate() == False:
      flash('All fields are required.')
      return render_template('contact.html', form=form)
    else:
      msg = Message(form.subject.data, sender='contact@example.com',     
          recipients=['email@email.com'])
      msg.body = """
      From: %s <%s>
      %s
      """ % (form.name.data, form.email.data, form.message.data)
      mail.send(msg)

      return render_template('contact.html', success=True)

  elif request.method == 'GET':
    return render_template('contact.html', form=form, admin=admin)

contact.html继承了两个管理模板。

{% import 'admin/layout.html' as layout with context -%}
{% extends 'admin/base.html' %}

因此,会抛出错误信息。

jinja2.exceptions.UndefinedError: 'admin_view' 未定义

我知道我可以修改模板以删除扩展管理员模板的部分,但整个网站的导航都是由

{{ layout.menu() }}
{{ layout.menu_links() }}

理想情况下,我希望能够使用管理员模板使“联系我们”页面正常工作。但是我不确定如何传递整个管理员上下文。

1个回答

5
您需要使用 flask_admin.base.BaseView.render 方法来使用 flask-admin 上下文处理模板。可能会像这样:

from flask_admin import BaseView, expose

class ContactsView(BaseView):
    @expose('/')
    def index(self):
        # Here are the contents of your "contact" route function
        return self.render('contact.html', form=form, admin=admin)

您可以像激活ModelView实例一样激活此视图:
admin.add_view(ContactsView('Contacts', url='/contacts'))

应用程序启动失败,显示“RuntimeError: Working outside of application context.”。 - ubert
好的,那是因为我暴露了__init__而不是索引,抱歉。 - ubert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接