社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

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

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
 
1945 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Daniel Roseman
Reply   •   1 楼
Daniel Roseman    6 年前

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    6 年前

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 %}