Py学习  »  Django

Django:如何在模板中使用修改后的queryset而不保存修改

Jay D. • 5 年前 • 1895 次点击  

context_data = {}
all_answers = Answer.objects.all()

for i in range(0, len(all_answers)) :
    all_answers[i].text = modify_text(all_answers[i].text, request)

context_data ["all_answers"] = all_answers 
print(context_data ["all_answers"][0].text) #Check that it was modified

return render(request, 'template.html', context_data)

在我的模板中,我喜欢:

{% for answer in all_answers.all %}
   {{ answer.text}}
{% endfor %}

检查表明已进行了修改,但它是我的模板answer.text是数据库中未修改的数据。

我看到context_data[“all_answers”]的类型是一个queryset,我猜它是在模板呈现期间触发的,使得任何未保存的更改都无用,如何使我的更改显示在模板中?

context_data ["all_answers"] = list(all_answers) 

加载查询集。检查有效,但模板中没有显示任何内容 (1)

在模板呈现过程中,当我使用 this function 将queryset加载到dict列表中。

3

我不想保存更改,因为它们是为每个请求定制的(基本上是为每个用户)。

PS:使用Python3.6.8和Django 2.2.3。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53589
 
1895 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Daniel Roseman
Reply   •   1 楼
Daniel Roseman    5 年前

range(len(something)) ,但总是在事情本身之上。对于Django queryset,这一点更为重要,因为通过其索引访问未评估queryset中的项( [i]

请改为:

for answer in all_answers:
    answer.text = modify_text(answer.text, request)

context_data ["all_answers"] = all_answers 
print(context_data ["all_answers"][0].text) #Check that it was modified

注意,循环计算queryset,因此 [0] 不会引起另一个数据库请求。

Nafees Anwar
Reply   •   2 楼
Nafees Anwar    5 年前

queryset不是数据持有者,它们只是惰性引用,在运行时进行计算。代码的问题是您正在修改queryset中的实例(这也是您应该使用 in 类似于操作员)。

for answer in all_answers:
    answer.text = modify_text(answer.text, request)

真正的问题是你打电话来 all all_answers.all 它返回一个新的queryset,并且没有您所做的更改,因此您应该在模板中执行

{% for answer in all_answers %}
   {{ answer.text}}
{% endfor %}