假设我有一个视图函数,它有许多 if/else 分支来处理不同的请求情况,比如它是否是 POST/GET/form 有效/等等。对于每个分支,我使用render
返回一个 http 响应对象。一切顺利。
我的问题是:这有效吗?例如,在我们看来,对于分支 A,我context_A = {key1:value1, key2:value2,...key10:value10}
使用模板进行渲染。后来用户请求同一个页面,这次它在视图函数中的分支 B 中结束,我再次调用渲染返回具有相同模板的 context_B。但是只有很小的区别,假设只有 value10 变化,而其他键/值对是相同的context_B
。context_A
这种情况的最佳做法是什么?现在我的解决方案是调用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函数还是可以正常返回数据?例如,render()
在 Django 视图中使用?
我正在努力更好地定义我的问题。抱歉,添麻烦了。也许有人可以稍后编辑我的问题,以便更好地参考未来的提问者。
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)