Django:可以查看返回渲染到ajax调用吗?

时间:2013-05-29 08:09:50

标签: jquery django

假设我有一个视图函数,它有许多if / else分支来处理不同的请求情况,例如POST / GET / form是否有效等等。对于每个分支,我使用render返回一个http响应对象。一切顺利。

我的问题是:效率如何?例如,对于我们视图中的分支A,我使用模板渲染context_A = {key1:value1, key2:value2,...key10:value10}。稍后用户请求相同的页面,这次它最终在视图函数的分支B中,我再次调用渲染返回context_B与相同的模板。但context_Bcontext_A只有非常小的区别,假设只有值10更改而其他键/值对相同。

这种情况的最佳做法是什么?现在我的解决方案是调用HttpResponse(而不是render)将json数据返回到jquery ajax方法,前提是整个模板已经返回。然后使用JQuery方法来操作DOM中的元素。但我担心这不是最好的做法,将来会引起维护问题。我认为在所有情况下使用上下文变量是一种更Djangoish的方式。但是如何?


编辑:代码示例

PS: 我是网络编程的新手。请承担我的代码质量。基本上我正在做的是将上下文与默认值放在一起,并在视图的末尾返回render()以保证至少返回一个http响应。然后对于if / else语句的每个分支,我将json类型的数据(图像url)返回到jquery ajax方法,并使用jquery将url放在src中。

PS2:
首先,为了避免页面刷新,我必须使用ajax发送请求(xhr),对吧?当我发出ajax请求时,是否必须将数据返回到该ajax函数,还是可以正常返回数据?例如,在Django视图中使用render()

我正在努力更好地定义我的问题。抱歉,添麻烦了。也许有人可以稍后编辑我的问题,以便更好地参考未来的提问者。


def upload(request, size, slug):
    comp = get_object_or_404(ActiveComp, slug=slug)
    form= UploadForm()
    # default context
    context = {'comp':comp, 'form':form}

    if request.method == 'POST':
        temp_file = request.FILES.get('image', False)

        """
        3 validations
        """
        if ...:
            return HttpResponse(json.dumps({"src":"none"}), mimetype="application/json")

        # type checking (not REAL type checking, only file extension checking)
        if ... : 
            return HttpResponse(json.dumps({"src":"not-image"}), mimetype="application/json")

        # size checking
        if ... :
            return HttpResponse(json.dumps({"src":"too-big"}), mimetype="application/json")

        # put uploaded image in db
        # ...

        # store image name in session
        request.session['f1'] = img.name

        #get thumbnail url using sorl-thumbnail
        try:
            timg = get_thumbnail(img.image, "160x110", quality=80, crop="center")
        except:
            context['turl'] = 'error'
        else:
            return HttpResponse(json.dumps({"src":timg.url}), mimetype="application/json")  

    else: # GET
        try:
            img = Image.objects.filter(user=request.user)[0]
        except Exception:
            context['turl'] = "" 
        else:           
            timg = get_thumbnail(img.image, "160x110", quality=50)
            # store image name in session, so delete view can know the filename
            request.session['f1'] = img.name
            context['turl'] = timg.url

    return render(request, 'template_A.html', context)

2 个答案:

答案 0 :(得分:1)

提问前编辑

高效明智吗?

取决于你的效率。

您是在谈论开发人员的效率还是代码的效率。

就个人而言,我尽量保持视图尽可能轻量级;用尽可能少的逻辑。这意味着我可能有给定页面的2或3个模板。我宁愿拥有多个模板,而不是一个大的单片模板。这意味着我可以直观地看到代码的作用。

要记住的是开发人员的时间很昂贵(可能每天数百美元/磅),而且硬件便宜。成为一名高效的开发人员而不是尝试使用高效的代码更具成本效益。

所以它的长短不一样,你认为它是你最有效的开发人员,如果你发现它很慢,那么就寻找性能提升或者只是抛出硬件。随着云计算的便宜,这种情况越来越多。

答案 1 :(得分:0)

@ Philip007,在编程时我尊重人们有自己的编码风格,思维过程和一般的做事方式。

如果我要继承你的代码,是的,我会做一些修改,使代码更简洁,但我明白你在做什么以及背后的原因。出于这个原因,我会说这是完全适合的目的。

我个人喜欢将我的GET和POST请求拆分为单独的方法,只是因为我喜欢一个函数只做一件事(但这是我的偏好)。 我可能还会在POST中的每个if语句中设置一个值,并在该代码块的末尾返回一个值;但这又是一般的家务。