Django 4, похоже, кэширует мои запросы. Как я могу его отключить?
Выпуск
Когда я обновляю объект недвижимости (дом) на сайте.
Например, я обновляю State
до Illinois - значение не отображается в:
all_properties = models.Property.objects.all()
Даже добавление нового свойства (дом) не отображается в all_properties
значении, когда UpdateView
перезагружается.
Он появляется только если я убью сервер Django и перезапущу его.
Что я могу сделать, чтобы обновленные данные появлялись при каждой загрузке UpdateView
?
Некоторый контекст
У меня есть модель с 20+ атрибутами.
Это для сайта объявлений о продаже недвижимости (как Airbnb). Поэтому есть такие вещи, как размер, спальни, город, штат и т.д.
Необходимо предусмотреть функцию автозаполнения текстовых полей, когда я редактирую эти свойства.
Например, State
- это текстовое поле в моей форме. Когда я добавляю 2-й дом на свой сайт, текстовое поле State
должно предлагать значения из предыдущих домов, которые есть в моей системе.
(В основном, когда я набираю C, он должен показать California, если у меня есть дома с California уже в БД)
UpdateView
Я использую представление обновления для отображения страницы Property-Edit (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})
Не отображается, потому что вы заполняете их при инициализации класса.
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()
Вот документация по добавлению дополнительного контекста.