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

标签 python django

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

问题是,如果我不提交表单,则执行 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

这是 View :

@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 类的类属性。该类是模块级全局类。因此,您将某些状态存储在网络服务器进程内存中的全局变量中。此状态对于应用程序的所有用户都是全局的,而不仅仅是提交表单的用户,并且将持续存在(对于所有用户都相同),直到它被明确更改或清除(或者直到您碰巧让您的下一个请求由生产网络服务器中的不同进程/线程)。

[编辑:我在这里以一种不清楚的方式使用了“全局”。类属性不是“全局”的,它们封装在类命名空间中,正如您所期望的那样。但是您将属性分配给类对象,而不是类的实例(您将在 __init__() 方法中执行此操作)。类对象是模块级全局的,它只有一组属性。每次你改变它们时,你都是在为每个人改变它们。如果您修改上面的代码,以便在 __init__() 方法中初始化您的三个字典,那么您的“缓存数据”“问题”就会消失;但您一开始想要的“神奇”持久行为也会如此。]

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

关于python - Django - 如何从以前的表单帖子中删除缓存的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/530715/

相关文章:

python - 如何将 PivotalTracker API 与 Python 2.7 结合使用

python - X 刻度与 Matplotlib 重叠

django - Heroku/ celery : Simultaneous tasks on one worker?

python - 在单个模型中使用相同的 related_name。 Django

python - django 应用程序媒体文件夹中的 css 文件出现 404 错误

Python - 文件名中的空格

python - 带连字符的数字或带连字符的数字字符串

django rest框架序列化器验证字段数据类型

Python:对本地服务器的请求不起作用

python - 使用 os.walk 在 python 中仅列出所有带有 png 的子目录