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()

Вот документация по добавлению дополнительного контекста.

Вернуться на верх