2013-11-20 25 views
0

我有一个简单的问题。我在django中有一个功能齐全的网站,它有一个标题,菜单和页脚,永不改变,内容也会发生变化。我简单的模板看起来像这样:
base.html文件在django中修改视图以处理ajax请求

<html> 
    ...header... 
    <body> 
    ...menu... 
    {%block content%}{%endblock%} 
    ...footer... 
    </body> 
</html> 

和content.html

{%extends 'base.html'%} 
{%block content%}...content according to selected menu item...{%endblock%} 

这一点,一切工作正常。 现在我决定,对于已启用javascript的用户,我可以添加ajax调用,因此无论何时点击上级菜单项(将有onClick),只有“content”块被升级。我的问题是:我可以重复使用我的原始以某种方式查看和修改它以适应两种需求 - 常规调用和ajax调用?或者我应该以某种方式重新设计我的模板?还是我需要为每个单独的视图?
我的简化图的样子:

def main(request,site): 
    ...some site processing... 
    return render_to_response('content.html',{'content':...site content...}) 

谢谢

回答

0

我认为在jquery.load()方法中使用url参数的方便功能要比使用django模板和视图更容易。所述jquery docs赛斯

的​​方法[...]允许我们指定的 一部分远程文档插入。这是通过url参数的特殊 语法实现的。如果字符串中包含一个或多个空格字符 ,则假定第一个 空间后面的字符串部分是用于确定要加载的内容 的jQuery选择器。

在JavaScript事件处理程序,只要简单的写是这样的:

$('.content').load('/otherPage.html .content'); 

这就是全部。

+0

这很有趣,谢谢,我会试试看。 – MartinM

+1

我是会接受这个答案,因为它会让我找到最终的解决方案。基本的想法是,如果你想在你的django应用中使用ajax,并且不必为它输入很多额外的代码,那就是以不同的方式考虑模板。您不应该扩展模板,而应该包含您希望以后通过Ajax更新的模块。如果请求是常规的,那么你只需渲染基础(或者任何扩展基础),如果Ajax只渲染片段,然后将其放置在应该出现的位置 - 很棒的是 - 你可以在一个视图中进行。检查[this](http://www.micahcarrick.com/ajax-form-submission-django.html) – MartinM

0

您可以检查您的视图Ajax调用,并给予相应的响应:

if request.is_ajax(): 
    #do something 

看看这里:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.is_ajax

希望这导致正确的方向。

+0

谢谢,我意识到这一点,但在这一点上,我只需要呈现content.html没有base.html,我真的不知道如何做到这一点,没有“扩展”标记的内容重复模板代码 – MartinM

+0

大多数情况下,您只需以JSON格式返回一些“值”,并通过JavaScript将其插入到您的网站中即可。 – Jingo

+0

返回html是不好的原则? – MartinM