Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 上下文变量在刷新时呈现上一个值_Django_Django Forms - Fatal编程技术网

Django 上下文变量在刷新时呈现上一个值

Django 上下文变量在刷新时呈现上一个值,django,django-forms,Django,Django Forms,我创建了一个表单,它接受文件上传,并在发布时从文件中获取一些有趣的数据 但是,在刷新页面时,表单将返回其初始状态,但上一个文件中的数据将保留。我怎么修理它 这是我的密码: forms.py choices=(('all','all'), (‘一’、‘一’) 课堂票证详情(forms.Form): file=forms.FileField() type=forms.ChoiceField(choices=choices) 定义初始化(self,*args,**kwargs): super() 视

我创建了一个表单,它接受文件上传,并在发布时从文件中获取一些有趣的数据

但是,在刷新页面时,表单将返回其初始状态,但上一个文件中的数据将保留。我怎么修理它

这是我的密码:

forms.py

choices=(('all','all'),
(‘一’、‘一’)
课堂票证详情(forms.Form):
file=forms.FileField()
type=forms.ChoiceField(choices=choices)
定义初始化(self,*args,**kwargs):
super()
视图.py

def home(请求):
详细信息=[]
如果request.method==“POST”:
表单=TicketDetailForm(request.POST、request.FILES)
如果form.is_有效():
如果form.cleaned_数据['type']=='all':
file=form.cleaned_data['file'].read()
detail.append([str(文件'utf-8')]))
#有关该文件的更多解决方法
其他:
表单=TicketDetailForm()
返回呈现(请求'home.html',{'form':表单,
“详细信息”:详细信息})
home.html

{%extends'base.html%}
{%block content%}
{%csrf_令牌%}
{{form.as_p}}

{%if详细信息%} 详情如下:

{d详细信息中的%d} {{d} {%endif%} {%endif%} {%endblock%}
这是因为在刷新页面时重新发布表单,因为即使表单有效,视图也只呈现模板。服务器的正确行为是在成功提交
POST
后始终重定向。换句话说,在
if form.is\u valid()
中,您应该以
返回重定向('home')
结束

您的视图应始终执行以下操作:

  • 对于GET请求,呈现模板
  • 对于POST请求和无效表单,请呈现模板(使用无效表单,以便用户可以修复错误)。在这里点击刷新是可以的,它只会重新提交无效的表单,因此不会引起问题
  • 对于POST请求和有效表单,请重定向,以便最后一个请求是GET请求,并且用户在刷新时无法重新提交。这也避免了再次呈现有效表单

不幸的是,将重定向添加到主页也不起作用。当然,它不会为“detail”变量获取任何值。您必须进一步解释您的流程或业务逻辑。通常,您会有一个列表视图,显示保存在数据库中的对象。单独查看每个对象的详细视图。以及创建视图,您可以在其中创建新对象。提交新对象时,将重定向到详细视图,该视图将显示该对象,因为它可以从db中检索。或者在列表视图中,您将看到新对象添加到列表中。是的,我知道了。然而,这似乎是一个特殊的情况。如果您注意到我的模板,则仅当存在详细信息变量时才会呈现第二个div。这个细节变量只有在表单post上才有一个值。我就是想不起这个难题。哼!是的,我理解你的模板和视图在做什么,但是我不理解它的逻辑。
detail
是否以某种方式保存到您的数据库中?如果不是,这意味着这只是一次性的?用户提交某些内容以查看结果,但如果他们离开页面,则会丢失结果?完全正确!我这里不使用db。