Flask Admin-有没有一种方法可以存储表视图的当前url(应用自定义过滤器)



我在Flask Admin的票务系统上工作。Flask管理环境将是所有用户的主要环境。为了创建或编辑票证,我从Flask Admin出发,使用wtforms来实现后端逻辑。在创建或编辑票证(validate_on_submit)之后,我想重定向回Flask Admin,所以我使用redirect(url_for(ticket.index_view))。它运行良好。

有没有一种方法可以重定向到flask管理,但也可以使用用户离开flask管理环境之前应用的特定过滤器?(这是url的基本GET参数-但在FLASK中(

我试图使用:

  • referrer = request.referrer
    
  • get_url()

但我可能错过了一些关键的东西,不知道如何实现它(把它放在哪里,这样我就可以调用参数(

非常感谢。

编辑:添加更多上下文:

我有一个烧瓶管理员为不同角色的用户定制。主要的ModelView显示了TICKETS:类的细节对我当前的问题并不重要,但它看起来是这样的:

class TicketModelView(ModelView):
column_list = ['id', 'title', 'osoba', 'content', 'povod_vmc_kom', 'dateVMC','zodpovedni', 'deadline', 'odpoved', 'solution', 'is_finished']
column_searchable_list = ['osoba']
column_filters = [ 'povod_vmc_kom', 'dateVMC', 'osoba', 'zodpovedni']
column_labels = dict(povod_vmc_kom='VMČ / Komisia', dateVMC='Dátum VMČ / komisie', zodpovedni = "Zodpovední")
column_display_actions = True
column_filters = [
FilterEqual(column=Ticket.povod_vmc_kom, name='Výbor/komisia', options=(('VMČ Juh','VMČ Juh'), ('UM','UM'), ('Kom dopravy','Kom dopravy'))),
'zodpovedni', 'is_finished',
'dateVMC', 'osoba'
]
def is_accessible(self):
#práva pre vedenie mesta - môže len nazerať
if current_user.is_authenticated and current_user.role == 0:
self.can_export=True
self.can_delete = False
self.can_edit = False
self.can_create = False
self._refresh_form_rules_cache()
self._refresh_forms_cache()
return True
#práva pre super admina (ostatné práva sú defaultne zapnuté)
if current_user.is_authenticated and current_user.role == 1:
self.can_export=True
self.can_delete=True
self.form_edit_rules = ('zodpovedni', 'is_finished' )
self.column_editable_list = ['is_finished']
self._refresh_form_rules_cache()
self._refresh_forms_cache()
return True
#práva pre garantov
if current_user.is_authenticated and current_user.role == 2:
self.can_delete = False
self.can_create = False
self.can_edit = False
self.can_export=True
self.column_searchable_list = ['title']

self._refresh_form_rules_cache()
self._refresh_forms_cache()
return True
#práva pre veducich utvarov
if current_user.is_authenticated and current_user.role == 3:
self.can_create = False
self.can_delete = False
self.can_export=True
self.column_searchable_list = ['title']
self.column_editable_list = ['odpoved', 'date_odpoved', 'solution', 'date_solution' ]
self.form_edit_rules = ('odpoved', 'date_odpoved', 'solution', 'date_solution')
self._refresh_form_rules_cache()
self._refresh_forms_cache()
return True
return False

def _solution_formatter(view, context, model, name):
# Format your string here e.g show first 20 characters
# can return any valid HTML e.g. a link to another view to show the detail or a popup window
if model.solution:
return model.solution[:50]
pass
def _content_formatter(view, context, model, name):
# Format your string here e.g show first 20 characters
# can return any valid HTML e.g. a link to another view to show the detail or a popup window
if len(model.content) > 100:
markupstring = "<a href= '%s'>%s</a>" % (url_for('ticket', ticket_id=model.id), "...")
return model.content[:100] + Markup(markupstring)
return model.content
def _user_formatter(view, context, model, name):
if model.id:
markupstring = "<a href= '%s'>%s</a>" % (url_for('ticket', ticket_id=model.id), model.id)
return Markup(markupstring)
else:
return ""
column_formatters = {
'content': _content_formatter,
'solution': _solution_formatter,
'id': _user_formatter
}

当用户在Flask Admin中查看TicketView时,他可以应用各种过滤器,这对整个web应用程序的用户体验至关重要。过滤器工作正常,它们作为GET参数存储在URL中当他想创建或编辑一个票证时,我不允许他在Flask Admin中这样做(我编辑了Flask Admin layout.html模板,并在导航栏中添加了一个按钮,该按钮使用wtforms重定向到我的new_ticket url。(因为我想应用后端逻辑。例如当他编辑字段"时;解决方案":我想要字段"中的值;日期_解决方案";自动生成(date.today(((。所以我使用wtforms和烧瓶路由:示例如下:

@app.route("/ticket/<int:ticket_id>/solution", methods = ['GET', 'POST'])
@login_required
def solution(ticket_id):
if current_user.role != 3:
flash("Pre zadanie riešenia alebo odpovede musíte byť prihlásený ako vedúci útvaru", "danger")
return redirect(url_for('ticket', ticket_id=ticket_id))
ticket = Ticket.query.get_or_404(ticket_id)
form = AdminPanelForm()
if form.validate_on_submit():
print("1")
if not ticket.date_solution:
print("2")
ticket.date_solution= datetime.now()
if not ticket.date_odpoved:
print("3")
if form.odpoved.data != ticket.odpoved:
print("4")
ticket.date_odpoved= datetime.now()
ticket.solution = form.solution.data
ticket.odpoved = form.odpoved.data
ticket.is_finished = True
db.session.commit()
flash("Ticket bol updatenutý", "success")
**return redirect(url_for('ticketmod.index_view'))**
elif request.method == 'GET':
form.solution.data = ticket.solution
form.odpoved.data = ticket.odpoved
return render_template("admin_ticket.html", form=form, ticket = ticket)

现在您可以看到,在成功更新票证后,用户被重定向到他来自的票证模型视图,return redirect(url_for('ticketmod.index_view')),但没有应用过滤器。我正在寻找解决方案,如何存储url GET参数(过滤器(,然后在重定向回ModelView时使用它们。我尝试了函数get_url((或request.referrer,但没有成功。

正如我在最初的帖子中所说,也许我错过了网络架构中至关重要的东西——如果你有一些学习材料,我应该看看:谢谢你的建议。

在格式化程序方法中,您可以使用以下方法获取视图的url,其中包括应用的过滤器/排序标准:

_view_url = view.get_url('.index_view', **request.args)

现在将其作为参数或其他方式传递给路由请求。例如:

class TicketModelView(ModelView):
#  blah blah
def _user_formatter(view, context, model, name):
if model.id:
#  This is the current url of the view including filters
_view_url = view.get_url('.index_view', **request.args)
# Pass this as a parameter to your route
markupstring = "<a href= '%s'>%s</a>" % (url_for('ticket', ticket_id=model.id, return_url=_view_url), model.id)
return Markup(markupstring)

在路由中,您现在可以从请求arg中提取return_url,并将其作为隐藏字段添加到表单中。然后在post-back中从表单中检索值并重定向。

@app.route("/ticket/<int:ticket_id>/solution", methods = ['GET', 'POST'])
@login_required
def solution(ticket_id):
#  Get the return_url from the request
_return_url = request.args.get('return_url'):
#  Add the return_url to the form as a hidden field
form.return_url.data = _return_url
#  blah blah
if form.validate_on_submit():
#  get return value from form
_return_url = form.return_url.data
return redirect(_return_url) if _return_url else redirect(url_for('ticketmod.index_view'))

最新更新