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