Python Django-如何从以前的表单帖子中删除缓存结果?

Python Django-如何从以前的表单帖子中删除缓存结果?,python,django,Python,Django,我有一个django表单,它包含一个字符串字典。我给了表单一个提交按钮和一个预览按钮。当输入一些信息后按下preview按钮时,会发送一条POST,字典中的字符串会自动恢复(我假设它是使用会话状态或其他方式完成的)。这很好,正是我想要的 问题是,如果我不提交表单,然后执行GET(即浏览到包含表单的页面),输入一些信息并点击preview,第一次预览时存储在字典中的信息仍然存在 如何清除此信息 以下是我的表格: class ListingImagesForm(forms.Form): #th

我有一个django表单,它包含一个字符串字典。我给了表单一个提交按钮和一个预览按钮。当输入一些信息后按下preview按钮时,会发送一条POST,字典中的字符串会自动恢复(我假设它是使用会话状态或其他方式完成的)。这很好,正是我想要的

问题是,如果我不提交表单,然后执行GET(即浏览到包含表单的页面),输入一些信息并点击preview,第一次预览时存储在字典中的信息仍然存在

如何清除此信息

以下是我的表格:

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编程那么长时间,所以任何关于修复某些代码的指针都是受欢迎的:)

这段代码在概念上是不完整的;它永远不会做你想做的事。词典是ListingImagesForm类上的类属性。此类是模块级全局类。因此,您正在Web服务器进程的内存中的全局变量中存储一些状态。此状态对应用程序的所有用户(而不仅仅是提交表单的用户)都是全局的,并且将持续(对所有用户都是相同的),直到它被显式更改或清除(或者直到您的下一个请求恰好由生产Web服务器中的不同进程/线程提供)

[EDIT:我在这里不清楚地使用了“global”。类属性不是“global”,正如您所期望的那样,它们封装在类名称空间中。但是您将属性分配给类对象,而不是类的实例(您可以在uu init_u()方法中执行此操作)。类对象是一个模块级全局对象,它只有一组属性。每次更改它们时,您都在为每个人更改它们。如果您修改上述代码,使三个字典在uu init_u()方法中初始化,则“缓存数据”问题将消失;但“神奇”问题也将消失您首先需要的持久性行为。]


您需要重新思考您的设计,清楚地了解Django不会“自动”为您跨请求维护任何状态。所有状态必须通过POST或GET显式传递,或显式保存到会话。除了不可变的配置类型信息外,应避免表单类上的类属性,而实例属性仅用于在处理单个请求时跟踪临时状态,它们不会在请求之间持续存在(在每个请求上都会创建表单类的新实例)。

确定-感谢您的解释,我没有意识到ListingImagesForm的属性是全局的,我必须查找封装规则:)对不起,不清楚;这不是真正的封装问题,而是类属性和实例属性之间的区别。我将添加一个编辑来尝试澄清。感谢您的解释。我很高兴django没有这种“魔力”,我怀疑你误解了这里到底发生了什么。您是否使用通用视图?表单是否为ModelForm子类化?否,我们没有为ModelForm子类化,也没有使用通用视图请提供表单和视图函数的代码示例。