【问题标题】:Django: can view return render to ajax calls?Django:可以查看返回渲染到 ajax 调用吗?
【发布时间】:2013-05-24 09:37:38
【问题描述】:

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

我的问题是:这样有效吗?例如,在我们看来,对于分支 A,我使用模板渲染 context_A = {key1:value1, key2:value2,...key10:value10}。后来用户请求同一个页面,这次它在视图函数中的分支 B 中结束,我再次调用渲染返回具有相同模板的 context_B。但是context_Bcontext_A 只有很小的区别,假设只有 value10 变化,而其他键/值对是相同的。

这种情况的最佳实践是什么?现在我的解决方案是调用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)

【问题讨论】:

  • 请提供代码示例,以便更好地了解我们实际在说什么
  • @Alp,看看我的编辑,谢谢
  • 你为什么不把功能分成两个视图呢?由读取 (GET) 和写入 (POST) 分隔。公共代码可以放在私有方法中,也可以放在表单或模型类中。

标签: jquery django


【解决方案1】:

题前编辑

高效吗?

取决于你所说的高效。

你说的是开发者的效率还是代码的效率。

就我个人而言,我尽量保持视图的轻量级;尽可能少的逻辑。这意味着我可能有 2 或 3 个给定页面的模板。我宁愿拥有多个模板,而不是一个大型的整体模板。这意味着我可以更轻松地看到代码在做什么。

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

因此,总而言之,您是对的,您认为自己是最高效的开发人员,如果您发现它很慢,那么请寻找性能提升或只是将硬件投入其中。随着云计算的廉价性,这种情况变得越来越普遍。

【讨论】:

  • 关于成本效益的非常好的段落
  • 感谢马特,这很鼓舞人心。但我正在寻找更具体的东西。只需使用代码示例更新帖子。你能看一下吗?
【解决方案2】:

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

如果我要从您那里继承此代码,是的,我会进行一些更改以使代码更简洁,但我了解您的所作所为及其背后的原因。出于这个原因,我会说这是完全足够的代码。

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

【讨论】:

  • 谢谢,我把你的话当作鼓励:) Edit>PS2 关于 ajax 调用怎么样?如果我在返回 ajax 调用时调用 render(我想它总是返回一个完整的 html 页面?)会发生什么?
  • 假设我总是使用 ajax 来发出 POST 请求。我有一个单独的视图函数来处理 POST。在该函数结束时我应该返回什么?
  • @Philip007 假设我总是使用 ajax 来发出 POST 请求。我有一个单独的视图函数来处理 POST。我应该在该函数结束时返回什么?您可以返回包含一些 JSON 数据的 HttpResponse,您并不总是需要调用 render。
  • 关于 ajax 调用的 Edit>PS2 怎么样?如果我在返回 ajax 调用时调用 render(我想它总是返回整个 html 页面?)会发生什么? render 并不总是必须返回整个网页。您可以返回部分或编辑 mime 类型,以便可以使用渲染返回 JSON。 Html Partial [stackoverflow.com/questions/1933631/… 是可以在模板中创建的 HTML 代码片段。它可能只是几个 div 和一些文本,也可能是您网页的页脚部分。
猜你喜欢
  • 2015-05-21
  • 1970-01-01
  • 2018-10-02
  • 2017-04-29
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2011-11-29
相关资源
最近更新 更多