用ajax和javascript覆盖HTML对象
我正在处理金字塔中的MySQL数据,需要根据JS ajax调用的结果更改HTML if语句 我的主页从用ajax和javascript覆盖HTML对象,javascript,python,html,ajax,Javascript,Python,Html,Ajax,我正在处理金字塔中的MySQL数据,需要根据JS ajax调用的结果更改HTML if语句 我的主页从views.py接收数据,并将其传递到.mak脚本。这里重要的视图是主视图(它获得了基本的身份验证)和接收ajax帖子的视图。 此时,主视图返回指向一周前的数据对象(oData)和datetime对象(history\u week) 视图。py: #This view queries for data that I will use in the mak file @view_config(r
views.py
接收数据,并将其传递到.mak
脚本。这里重要的视图是主视图(它获得了基本的身份验证)和接收ajax帖子的视图。此时,主视图返回指向一周前的数据对象(
oData
)和datetime
对象(history\u week
)
视图。py:
#This view queries for data that I will use in the mak file
@view_config(route_name='monitor',
renderer='monitor:templates/monitor.mak',
permission='edit'
)
def monitor(self):
import datetime
request = self.request
oData = DBSession.query(Alert).order_by(Alert.time)
history_week = datetime.datetime.now() - datetime.timedelta(days=7)
return {
'oData' : oData,
'logged_in' : request.authenticated_userid,
'history_week' : history_week,
}
...
...
#this is the view for my js ajax call
@view_config(route_name="history_ajax",renderer="json")
def history_ajax(self):
import datetime, json
iDays = self.request.POST.get('days')
history_days_ajax = datetime.datetime.now() - datetime.timedelta(days=iDays)
#because datetime.datetime is not serializable
from json import JSONEncoder
class DateEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.date):
return obj.isoformat()
return JSONEncoder.default(self, obj)
return {
'history_days_ajax' : json.dumps(history_days_ajax, cls=DateEncoder),
}
% for oAlert in oData[::-1]:
% if oAlert.time >= history_week:
<table id="Alerts">
...
$(document).ready(function(){
$('#day').click(function(event){
$.ajax({
type: "POST",
url: "history",
dataType: "json",
data: {
'days': 1,
},
async: false,
success: function(data) {
history = data.history;
},
});
我使用这些数据来绘制数据表,但我只想在一定的时间范围内绘制它们。目前,所有小于一周的数据表都会被打印出来
HTML:
#This view queries for data that I will use in the mak file
@view_config(route_name='monitor',
renderer='monitor:templates/monitor.mak',
permission='edit'
)
def monitor(self):
import datetime
request = self.request
oData = DBSession.query(Alert).order_by(Alert.time)
history_week = datetime.datetime.now() - datetime.timedelta(days=7)
return {
'oData' : oData,
'logged_in' : request.authenticated_userid,
'history_week' : history_week,
}
...
...
#this is the view for my js ajax call
@view_config(route_name="history_ajax",renderer="json")
def history_ajax(self):
import datetime, json
iDays = self.request.POST.get('days')
history_days_ajax = datetime.datetime.now() - datetime.timedelta(days=iDays)
#because datetime.datetime is not serializable
from json import JSONEncoder
class DateEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.date):
return obj.isoformat()
return JSONEncoder.default(self, obj)
return {
'history_days_ajax' : json.dumps(history_days_ajax, cls=DateEncoder),
}
% for oAlert in oData[::-1]:
% if oAlert.time >= history_week:
<table id="Alerts">
...
$(document).ready(function(){
$('#day').click(function(event){
$.ajax({
type: "POST",
url: "history",
dataType: "json",
data: {
'days': 1,
},
async: false,
success: function(data) {
history = data.history;
},
});
以下是我的问题:
1) 如何根据javascript的ajax调用更改我的if
语句?或者,有没有更好的方法在不使事情复杂化的情况下做到这一点?2) 我需要替换if语句中的datetime对象,因为首先页面需要加载一些内容,其次我希望默认值为1天。理想情况下,这应该是解决方案的一部分
我希望我把一切都说清楚了。这是一个相当长的问题。我最终在没有ajax和一些重组的情况下完成了这项工作: 我现在没有定义静态路由,而是:
config.add_route(dRoute['monitor'], dRoute['/monitor/{duration}'])
我没有在HTML中进行过滤,而是通过DBSession在我的views.py中进行过滤。在这里,我检查我的url,并相应地用python进行计算,这使一切变得更加简单:
@view_config(route_name='monitor',
renderer='monitor:templates/monitor.mak',
permission='edit'
)
def monitor(self):
import datetime
request = self.request
sDuration = request.matchdict['duration']
if sDuration == 'Day':
oDateThreshold = datetime.datetime.now() - datetime.timedelta(days=1)
elif sDuration == 'Week':
oDateThreshold = datetime.datetime.now() - datetime.timedelta(days=7)
etc...
oData = DBSession.query(Alert).order_by(Alert.time).filter(Alert.time>=oDateThreshold)
return {
'oData' : oData,
'logged_in' : request.authenticated_userid,
'history_week' : history_week,
'sDuration' : sDuration,
}
最后,按下按钮时,我会像这样更改HTML中的路径:
<a id="week" href="${request.route_url('monitor',duration='Week')}">
1 Week
</a>
这让我摆脱了ajax
换句话说,事情就是这样:当我单击我的按钮时,href将当前页面的路径(
monitor
)更改为monitor/'duration'
)。然后,我的视图读取新的url并根据它进行计算。然后,返回的数据将在我的.mak文件中使用,而不会使那里的事情复杂化