Django - как удалить кэшированные результаты из предыдущих сообщений формы? - PullRequest
0 голосов
/ 10 февраля 2009

У меня есть форма Django, которая содержит словарь строк. Я дал форму кнопку отправки и кнопку предварительного просмотра. Когда кнопка предварительного просмотра нажимается после ввода некоторой информации, отправляется сообщение POST, и строки в словаре автоматически восстанавливаются (я предполагаю, что это сделано с использованием состояния сеанса или чего-то еще). Это здорово, именно то, что я хотел.

Проблема в том, что если я не отправлю форму, то сделаю GET (то есть перейду на страницу с формой на ней), введу некоторую информацию и нажму на предварительный просмотр, информацию, которая была сохранена в словаре из Первый предварительный просмотр все еще там.

Как вы очистите эту информацию?

Ниже моя форма:

class ListingImagesForm(forms.Form):   
#the following should be indented
def clear_dictionaries(self):
    self.statuses = {}
    self.thumbnail_urls = {}
    self.image_urls = {}

statuses = {}
thumbnail_urls = {}
image_urls = {}

valid_images = SortedDict() #from the django framework
photo_0 = forms.ImageField(required=False, label='First photo')
photo_1 = forms.ImageField(required=False, label='Second photo')

def clean_photo_0(self):
    return self._clean_photo("photo_0")

def clean_photo_1(self):
    return self._clean_photo("photo_1")


def _clean_photo(self, dataName):
    data = self.cleaned_data[dataName]
    if data != None:
        if data.size > max_photo_size:
            raise forms.ValidationError("The maximum image size allowed is 500KB")
        elif data.size == 0:
            raise forms.ValidationError("The image given is empty.")
        else:
            self.valid_images[dataName] = data
            self.statuses[dataName] = True
            list_of_image_locs = thumbs.save_image_and_thumbs(data.name, data)
            self.image_urls[dataName] = list_of_image_locs[0]
            self.thumbnail_urls[dataName] = list_of_image_locs[1]
    return data

А вот и вид:

@login_required
def add(request):
#the following should be indented
preview = False
added = False
new_listing = None
owner = None

if request.POST:
    form = GeneralListingForm(request.POST)
    image_form = ListingImagesForm(request.POST, request.FILES)

    if image_form.is_valid() and form.is_valid(): 
        new_listing = form.save(commit=False)
        new_listing.owner = request.user.get_profile()

        if request.POST.get('preview', False):
            preview = True
            owner = new_listing.owner

        elif request.POST.get('submit', False):
            new_listing.save()
            for image in image_form.image_urls:
                url = image_form.image_urls[image]
                try:
                    new_image = Image.objects.get(photo=url)
                    new_image.listings.add(new_listing)
                    new_image.save()
                except:
                    new_image = Image(photo=url)
                    new_image.save()
                    new_image.listings.add(new_listing)
                    new_image.save()

            form = GeneralListingForm()
            image_form = ListingImagesForm()
            image_form.clear_dictionaries() 
            added = True

else:
    form = GeneralListingForm()
    image_form = ListingImagesForm()
    image_form.clear_dictionaries()

return render_to_response('add_listing.html', {'form': form, 'image_form' : image_form, 
                                                'preview': preview, 'added': added,
                                                'owner': owner, 'listing': new_listing,
                                                'currentmaintab': 'listings',
                                                'currentcategory': 'all'},
                                                                        context_instance=RequestContext(request))

Я не так долго программировал на django или python, поэтому любые указания по исправлению части кода приветствуются:)

1 Ответ

2 голосов
/ 10 февраля 2009

Этот код не соответствует концепции; он никогда не будет делать то, что вы хотите. Ваши словари являются атрибутами класса в классе ListingImagesForm. Этот класс является глобальным на уровне модуля. Таким образом, вы сохраняете некоторое состояние в глобальной переменной в памяти в процессе веб-сервера. Это состояние является глобальным для всех пользователей вашего приложения, а не только для пользователя, который отправил форму, и будет сохраняться (одинаково для всех пользователей) до тех пор, пока оно не будет явно изменено или очищено (или до тех пор, пока вы просто не получите следующий запрос от другой процесс / поток в производственном веб-сервере).

[ EDIT : я использовал "глобальный" здесь неясно. Атрибуты класса не являются «глобальными», они заключены в пространство имен класса, как и следовало ожидать. Но вы присваиваете атрибуты объекту класса, а не экземплярам класса (что вы делаете в методе __init __ ()). Объект класса является глобальным на уровне модуля и имеет только один набор атрибутов. Каждый раз, когда вы меняете их, вы меняете их для всех. Если вы измените приведенный выше код так, чтобы ваши три словаря были инициализированы с помощью метода __init __ (), то ваша проблема с «кэшированными данными» исчезла бы; но то же самое можно сказать и о «магическом» поведении, которое вы хотели бы получить.]

Вам необходимо переосмыслить свой дизайн с четким пониманием того, что Django не "автоматически" поддерживает какое-либо состояние для вас при выполнении запросов. Все ваше состояние должно быть явно передано через POST или GET или явно сохранено в сеансе. Следует избегать атрибутов класса в классе Form, за исключением неизменяемой информации о типе конфигурации, а атрибуты экземпляра полезны только для отслеживания временного состояния при обработке одного запроса, они не будут сохраняться между запросами (новый экземпляр вашего класса Form). создается по каждому запросу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...