gpt4 book ai didi

django 小部件查询集未更新

转载 作者:行者123 更新时间:2023-12-02 23:46:10 25 4
gpt4 key购买 nike

我有一个自定义的 django 小部件来替换标准的 ModelChoiceField 小部件。

class SelectModelWidget(forms.TextInput):
"""
@Usage: field = ModelChoiceField(queryset=Model.objects.all(),
widget=SelectModelWidget(attrs={}))
"""

def __init__(self, attrs=None, title=None,
template="widgets/select_widget.html"):
super(SelectModelWidget, self).__init__(attrs)
self.template = template
self.title = title

def render(self, name, value, attrs=None):
if value is None: value = ''

# TODO: the queryset does not update
# Set the title for the selection page, use model name as default
model_queryset = self.choices.queryset
if model_queryset is not None and self.title is None:
self.title = model_queryset.model._meta.verbose_name.title()

# Get the currently selected instance if it exists
try:
instance = model_queryset.get(pk=value)
text = instance
except (ValueError, model_queryset.model.DoesNotExist):
text = ''

form_id = attrs.pop("id")
widget_template = loader.get_template(self.template)
context = Context({
"attrs": attrs,
"id": form_id,
"name": name,
"value": value,
"text": text,
"title": self.title,
"queryset": model_queryset,
})

return widget_template.render(context)

问题似乎与此区域有关:

    model_queryset = self.choices.queryset
if model_queryset is not None and self.title is None:
self.title = model_queryset.model._meta.verbose_name.title()

self.choices.queryset 行应该获取传递给 ModelChoiceField 的查询集,我认为我缺乏对其初始化方式的理解,因为当我第一次加载页面时,模型查询集填充得很好,但是,如果我添加该模型的新实例并重新加载页面,查询集不会更新以包含新实例。我必须重新启动服务器才能使新实例出现在列表中。是否有任何原因导致查询集仅初始化一次并且从不更新?

编辑:要添加的是,我确信这是小部件代码,因为当我从表单中删除小部件并使用默认小部件(不确定是哪个)时,它可以完美地工作,正如我所期望的那样。我只是不明白为什么 model_queryset 变量永远不会用新的查询集更新。

在我的项目中与此小部件相关的表单代码实际上只是:

address = forms.ModelChoiceField(queryset=models.Address.objects.all(),
widget=widgets.SelectModelWidget())

最佳答案

self.choices.queryset.all() 应该可以工作。

关于django 小部件查询集未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14672407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com