[英]Passing RSS feeds to django view using AJAX
我对ajax相当陌生,下面是我的用例:我正在开发一个附带项目,它将显示新闻和各种体育赛事的得分。 为了执行相同的操作,我使用来自不同来源的rss feed。 我能够使用'feedparser'插件在django视图中获取并解析rss feed,并将与上下文相同的内容传递给相应的模板。 以下是我的查看功能和模板(用于板球)。
def cricket(request):
feeds_cric = feedparser.parse('http://www.espncricinfo.com/rss/content/story/feeds/0.xml') #espncricinfo feed.
feeds_cric_scores = feedparser.parse('http://static.cricinfo.com/rss/livescores.xml') #espncricinfo feed.
context = {'feeds_cric': feeds_cric,'feeds_cric_scores' : feeds_cric_scores}
return render(request,'scorecenter/cricket.html', context)
以下是相应的模板。
{% extends "scorecenter/index.html" %}
{% block content %}
<ul>
{% for entry in feeds_cric.entries %}
<li><a href="{{ entry.link }}">{{ entry.title }}</a></li>
<p>{{ entry.description }}</p>
{% endfor %}
</ul>
{% endblock content %}
{% block score %}
<ul>
{% for entry in feeds_cric_scores.entries %}
<li><a href="{{ entry.link }}">{{ entry.title }}</a></li>
<!-- <p>{{ entry.description }}</p> -->
{% endfor %}
</ul>
{% endblock score %}
以下是index.html文件。
现在,我想使用AJAX仅重新加载页面的某些块,而不是重新加载和重定向整个页面。 我写了一个脚本来检查
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">Allscores</a>
</div>
<div>
<ul class="nav navbar-nav navbar-right">
<li><a href="#" onclick="urlChecker('cricket')">Cricket</a></li>
<li><a href="#" onclick="urlChecker('football')">Football</a></li>
<li><a href="#" onclick="urlChecker('basketball')">Basketball</a></li>
<li><a href="#" onclick="urlChecker('tennis')">Tennis</a></li>
</ul>
</div>
</div>
</nav>
<div class="navbar navbar-default" id="empty_nav"></div>
<div class="testingData">This should be updated</div>
<div class="row">
<div class="col-sm-8" id="news">
<h3>Latest News</h3>
{% block content %}
{% endblock content %}
</div>
<div class="col-sm-4" id="scores">
<h3>Latest scores</h3>
{% block score %}
{% endblock score %}
</div>
</div>
<div id="footer">
Copyright © acllscores.com
</div>
</body>
在我的urlChecker()脚本中,我检查单击了哪个锚标记并分配了相应的url。 以下是脚本:
function urlChecker (route) {
switch(route) {
case 'cricket':
$.post( "/scorecenter/cricket/", function( data ) {
$( ".result" ).html( data );
});
break;
case 'football':
$.post( "/scorecenter/football/", function( data ) {
$( ".testingData" ).html( data );
});
break;
case 'tennis':
$.post( "/scorecenter/tennis/", function( data ) {
$( ".testingData" ).html( data );
});
break;
case 'basketball':
$.post( "/scorecenter/basketball/", function( data ) {
$( ".testingData" ).html( data );
});
break;
}
}
更新:添加网址文件:
urlpatterns = patterns('',
url(r'^$', views.index,name='index'),
url(r'^test/$', views.test,name='test'),
url(r'^cricket/$', views.cricket,name='cricket'),
url(r'^basketball/$', views.basketball,name='basketball'),
url(r'^football/$', views.football,name='football'),
url(r'^tennis/$', views.tennis,name='tennis'),
)
我不知道如何使用Ajax将提要数据发布到模板中。 请帮忙
从Ajax的角度来看
从您在问题中写的内容来看,发送GET
请求而不是POST
请求更为合适。 您不会将任何信息发送到它们需要存储的这些端点,而只想从它们检索更新。 这不会改变您的大部分代码,您可以使用☞ $.get()
代替$.post()
。
从Django的角度来看
发送GET
请求也更加容易,因为您无需考虑☞Django的CSRF保护 。 发出其他ajax请求(例如POST
, DELETE
等)也不是那么困难,但是它需要一个额外的步骤,该步骤涉及随每个请求发送CSRF令牌(在链接的文档中有详细记录)。
呈现Ajax请求的结果
当前,用于呈现Ajax结果的模板可能存在概念性问题,例如scorecenter/cricket.html
。 最顶层是从index.html
扩展的,这意味着每个请求不仅将返回要插入的html块,还将返回index.html
一部分的任何内容。
另外,由于您将通过Javascript将结果插入到已加载的网站中,因此无需定义模板块。 让这些模板仅使用$('.testingData').html(data)
精确呈现要插入到DOM中的$('.testingData').html(data)
。
使用Ajax请求调试问题
在开发网站时,请在浏览器中打开开发人员工具并在其中激活控制台(Firefox和Chrome都可以)。 每当Ajax请求失败时,它将在此处显示错误,然后您可以进行自省。
常见错误为404
(如果找不到端点), 400
或403
如果请求未被授权)或500
如果服务器在处理您的请求时出错)。 ☞更完整的状态码列表
请随时更新您的问题,并提供更多详细信息。 由于这是一个非常广泛的主题,因此请做好准备,使其可能被社区关闭。 在这种情况下,您始终可以搜索更具体的问题,或者,如果找不到答案,请将其放在新问题中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.