Django 4似乎正在缓存我的查询.我怎么关掉它?



事件

当我在网站上更新属性(房子)时。例如,我将State更新为Illinois——值没有显示在:

all_properties = models.Property.objects.all()

UpdateView重新加载时,即使添加新属性(房屋)也不会显示在all_properties值中。

只有当我杀死Django服务器并重新启动它时,它才会显示出来。

我怎么做才能在每次加载UpdateView时都显示更新的数据?

一些上下文我有一个20+属性的模型。
这适用于房源列表网站(如Airbnb)。比如大小、卧室、城市、州等。

当我编辑这些属性时,需要在文本框上有一个自动完成功能。

例如,State是我的表单中的文本字段。当我在我的网站上添加第二个房子时,State文本框应该建议我在我的系统中以前的房子的值。

(基本上当我输入C时,如果我有加利福尼亚州已经在DB中的房屋,它应该显示加利福尼亚州)

UpdateView

我正在使用更新视图来显示我的属性编辑(House-Edit)页面。
我需要在这个更新视图中传递所有这些auto-complete fields,以便我可以将它们添加到我的文本框中。

代码如下:

class PropertyUpdateView(LoginRequiredMixin, UpdateView):
context_object_name = 'property'
model = models.Property
form_class = forms.PropertyForm
template_name = 'desertland/admin/property_update.html'
extra_context = get_autocomplete_fields()
def get_success_url(self):
messages.success(self.request, 'The property was updated successfully.')
return reverse('property_update', kwargs={'pk': self.object.id})

extra_content是我传递自动完成字段的地方。
get_autocomplete_fields()方法如下:

def get_autocomplete_fields():
ac_keys = ['state', 'city', 'county', 'zip_code', 'zoning', 'power', 'water_district', 'water', 'access', 'vetting']
autocomplete_data = {}
temp_list = {}
all_properties = models.Property.objects.all()
# Creating empty dictionaries for the autocomplete fields
for key in ac_keys:
temp_list[key] = []
autocomplete_data[key] = []
for property in all_properties:
for key in ac_keys:
# Creating a key if it does not exist
if autocomplete_data.get(key) is None:
autocomplete_data[key] = []
val = getattr(property, key)
# Creating an array of distinct values from the property
if val and val not in temp_list[key]:
temp_list[key].append(val)
autocomplete_data[key].append({'value': val, 'label': val})
return {'autocomplete_data': autocomplete_data}

此函数正常工作并正确生成字典。

我的数据库模型是这样的:

class Property(models.Model):
id = models.AutoField(primary_key=True)
slug = models.SlugField(unique=True, db_index=True)
name = models.TextField(null=False, blank=False)
... more attributes ...
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Property, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse("property_update", kwargs={'id': self.pk})

一些进一步的调试,因为我发布了这个问题:

  1. 立即在DB中更新。
  2. 如果我通过ListViewUpdateView访问它们,则显示更新的值。(即它显示在输入字段或我的表)。
  3. 如果我重新启动Django服务器,它只会通过models.Property.objects.all()反映。
  4. 如果我创建一个新对象,计数在models.Property.objects.all()方法内保持不变。(即即使新对象被持久化在DB中也不会被反映)。
  5. 没有激活的缓存框架
  6. TIMEOUT=0在my settings.py中没有效果

它不会显示,因为您在初始化类时填充它们。

class PropertyUpdateView(LoginRequiredMixin, UpdateView):
context_object_name = 'property'
model = models.Property
form_class = forms.PropertyForm
template_name = 'desertland/admin/property_update.html'
# Here is the issue. extra_context is a static variable and 
# get_autocomplete_fields() is called when class is initialized,
# which in your case means when you start the server.
extra_context = get_autocomplete_fields()

您必须将这个额外的上下文移动到get_context_data()方法中。

class PropertyUpdateView(LoginRequiredMixin, UpdateView):
context_object_name = 'property'
model = models.Property
form_class = forms.PropertyForm
template_name = 'desertland/admin/property_update.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['autocomplete_properties'] = get_autocomplete_fields()
return context
extra_context = get_autocomplete_fields()

这里是关于添加额外上下文的文档。

相关内容

  • 没有找到相关文章

最新更新