事件
当我在网站上更新属性(房子)时。例如,我将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})
一些进一步的调试,因为我发布了这个问题:
- 立即在DB中更新。
- 如果我通过
ListView
或UpdateView
访问它们,则显示更新的值。(即它显示在输入字段或我的表)。 - 如果我重新启动Django服务器,它只会通过
models.Property.objects.all()
反映。 - 如果我创建一个新对象,计数在
models.Property.objects.all()
方法内保持不变。(即即使新对象被持久化在DB中也不会被反映)。 - 没有激活的缓存框架
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()
这里是关于添加额外上下文的文档。