Python 在两个不同的函数中调用变量
我在问如何使用Python 在两个不同的函数中调用变量,python,django,Python,Django,我在问如何使用python2.7和Django 1.10将函数1中定义的变量调用到函数2中 我定义了一个函数1,如下所示: def Test(request) : form = TestForm(request.POST or None) if form.is_valid() : instance = form.save(commit=False) return HttpResponseRedirect('toto') context = {
python2.7
和Django 1.10
将函数1中定义的变量调用到函数2中
我定义了一个函数1
,如下所示:
def Test(request) :
form = TestForm(request.POST or None)
if form.is_valid() :
instance = form.save(commit=False)
return HttpResponseRedirect('toto')
context = {
"form" : form,
}
return render(request, 'form_Test.html', context)
我想在我的函数2中调用变量实例:
def Test2(request) :
identity = instance.lastname
context = {
"identity" : identity,
}
return render(request, 'test2_identity.html',context)
我想知道怎样才能做到这一点
----------------------------------------------------------------------------------------------
编辑:
#-*- coding: utf-8 -*-
from django.shortcuts import render, render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.template import loader
from .models import Identity, Country
from .forms import IdentityForm
def IdentityAccueil(request) :
template = loader.get_template('accueil_Identity.html')
return HttpResponse(template.render(request))
def IdentityFormulary(request) :
form = IdentityForm(request.POST or None)
template_name = 'form_Identity.html'
if form.is_valid() :
if '_preview' in request.POST :
post = form.save(commit=False)
template_name = 'preview.html'
elif '_save' in request.POST :
post = form.save()
return HttpResponseRedirect('formulaire_traite')
context = {
"form" : form,
}
return render(request, template_name, context)
def CompletedFormulary(request) :
identity = Identity.objects.all().order_by("-id")[0]
context = {
"identity" : identity,
}
return render(request, 'recapitulatif_identity.html',context)
我尝试在同一个视图中处理所有内容,使用预览步骤:
#views.py
def IdentityFormulary(request) :
form = IdentityForm(request.POST or None)
template_name = 'form_Identity.html'
if form.is_valid() :
if '_preview' in request.POST :
post = form.save(commit=False)
template_name = 'preview.html'
#if .is_valid() :
#post=form.save()
elif '_save' in request.POST :
post = form.save()
return HttpResponseRedirect('formulaire_traite')
context = {
"form" : form,
}
return render(request, template_name, context)
def CompletedFormulary(request) :
identity = Identity.objects.all().order_by("-id")[0]
context = {
"identity" : identity,
}
return render(request, 'recapitulatif_identity.html',context)
preview.html文件:
<!--preview.html-->
<h2 align="center"> Prévisualisation du formulaire </align> </h2>
{% block content %}
<h3> Récapitulatif des données enregistrées : </h3>
<li> Civilité : {{form.title}}</li>
<li> Nom : {{form.lastname}}</li>
<li> Prénom : {{form.firstname}}</li>
<li> Sexe : {{form.sex}}</li>
<li> Date de Naissance : {{form.birthday}}</li>
<li> Ville de Naissance : {{form.birthcity}}</li>
<li> Pays de Naissance : {{form.birthcountry}}</li>
<li> Nationalité : {{form.nationality}}</li>
<li> Profession : {{form.job}}</li>
<li> Adresse : {{form.adress}}</li>
<li> Ville : {{form.city}}</li>
<li> Code Postal : {{form.zip}}</li>
<li> Pays : {{form.country}}</li>
<li> Email : {{form.mail}}</li>
<li> Téléphone : {{form.phone}}</li>
{% endblock %}
<br></br>
<input type ="submit" name="_save" value="Valider la fiche individuelle" />
<h2 align="center"> Prévisualisation du formulaire </align> </h2>
<form method='POST' action=''> {% csrf_token %}
{% block content %}
<h3> Récapitulatif des données enregistrées : </h3>
<li> Civilité : {{form.title}}</li>
<li> Nom : {{form.lastname}}</li>
<li> Prénom : {{form.firstname}}</li>
<li> Sexe : {{form.sex}}</li>
<li> Date de Naissance : {{form.birthday}}</li>
<li> Ville de Naissance : {{form.birthcity}}</li>
<li> Pays de Naissance : {{form.birthcountry}}</li>
<li> Nationalité : {{form.nationality}}</li>
<li> Profession : {{form.job}}</li>
<li> Adresse : {{form.adress}}</li>
<li> Ville : {{form.city}}</li>
<li> Code Postal : {{form.zip}}</li>
<li> Pays : {{form.country}}</li>
<li> Email : {{form.mail}}</li>
<li> Téléphone : {{form.phone}}</li>
{% endblock %}
<br></br>
<input type ="submit" name="_save" value="Valider la fiche individuelle" />
</form>
公式化过程
{%block content%}
在登记册上签字:
Civilité:{{form.title}
名称:{{form.lastname}
名称:{form.firstname}
Sexe:{{form.sex}
出生日期:{{表格.生日}
诞生之城:{{形式.出生地}
出生地:{form.birthcountry}
国家:{形式.国籍}
职业:{{form.job}
地址:{{form.address}
维尔:{{form.city}
邮政编码:{form.zip}
支付:{form.country}
电子邮件:{{form.mail}
电话:{{form.phone}
{%endblock%}
我只是用我的preview.html中的submit按钮阻止,因为目前它不起作用简短回答:你的要求是不可能的,句号。即使是一个全局变量也无法工作,因为没有任何东西可以保证两个请求都将由同一个进程提供服务(即使这样,也会有许多其他无法解决的问题)
FWIW这实际上是我们在web开发中大量使用数据库的原因之一,因此我们可以在请求之间保持状态(单用户桌面应用程序可以在内存中为会话保留状态)
现在你在评论中提到
我不想从数据库中搜索,因为我想在验证之前获得一份数据简历(比如缓存)。这样,我可以在提交之前控制数据表单
如果这是您希望在两个视图之间共享实例
的原因,那么这不是方式-您有一个表单
,表单确实有验证(这实际上是django.forms
-验证用户提交的数据的主要原因),并且您可以在不同的点执行任何额外的验证。IOW:没有理由尝试在两个视图之间共享一个变量来验证表单
编辑:好,现在我们有XY问题的X部分:
我想得到的是:用户正在HTML页面中填写表单。然后,他得到一份简历和两个选项:提交(数据保存在MySQL数据库中)或修改数据表单。第二个选项允许再次获取填写的表单,他可以修改一个或多个值,然后提交到数据库
答案是:你不需要两个视图来处理这个案例,你只需要跟踪当前的“步骤”(初始提交/预览/编辑/最终提交),这并不是真正的火箭科学-使用请求方法很容易做到这一点(GET表示空表单,其他任何内容都要求预览、编辑或最终提交)和提交按钮名称(以确定应执行哪些预览/编辑/最终提交操作)。您可以使用form.save(commit=False)
获取未保存的实例(用于预览) 感谢@Brunodesshuilliers,我就是这样解决问题的:
My views.py文件:
#-*- coding: utf-8 -*-
from django.shortcuts import render, render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.template import loader
from .models import Identity, Country
from .forms import IdentityForm
def IdentityAccueil(request) :
template = loader.get_template('accueil_Identity.html')
return HttpResponse(template.render(request))
def IdentityFormulary(request) :
form = IdentityForm(request.POST or None)
template_name = 'form_Identity.html'
if form.is_valid() :
if '_preview' in request.POST :
post = form.save(commit=False)
template_name = 'preview.html'
elif '_save' in request.POST :
post = form.save()
return HttpResponseRedirect('formulaire_traite')
context = {
"form" : form,
}
return render(request, template_name, context)
def CompletedFormulary(request) :
identity = Identity.objects.all().order_by("-id")[0]
context = {
"identity" : identity,
}
return render(request, 'recapitulatif_identity.html',context)
My preview.html文件:
<!--preview.html-->
<h2 align="center"> Prévisualisation du formulaire </align> </h2>
{% block content %}
<h3> Récapitulatif des données enregistrées : </h3>
<li> Civilité : {{form.title}}</li>
<li> Nom : {{form.lastname}}</li>
<li> Prénom : {{form.firstname}}</li>
<li> Sexe : {{form.sex}}</li>
<li> Date de Naissance : {{form.birthday}}</li>
<li> Ville de Naissance : {{form.birthcity}}</li>
<li> Pays de Naissance : {{form.birthcountry}}</li>
<li> Nationalité : {{form.nationality}}</li>
<li> Profession : {{form.job}}</li>
<li> Adresse : {{form.adress}}</li>
<li> Ville : {{form.city}}</li>
<li> Code Postal : {{form.zip}}</li>
<li> Pays : {{form.country}}</li>
<li> Email : {{form.mail}}</li>
<li> Téléphone : {{form.phone}}</li>
{% endblock %}
<br></br>
<input type ="submit" name="_save" value="Valider la fiche individuelle" />
<h2 align="center"> Prévisualisation du formulaire </align> </h2>
<form method='POST' action=''> {% csrf_token %}
{% block content %}
<h3> Récapitulatif des données enregistrées : </h3>
<li> Civilité : {{form.title}}</li>
<li> Nom : {{form.lastname}}</li>
<li> Prénom : {{form.firstname}}</li>
<li> Sexe : {{form.sex}}</li>
<li> Date de Naissance : {{form.birthday}}</li>
<li> Ville de Naissance : {{form.birthcity}}</li>
<li> Pays de Naissance : {{form.birthcountry}}</li>
<li> Nationalité : {{form.nationality}}</li>
<li> Profession : {{form.job}}</li>
<li> Adresse : {{form.adress}}</li>
<li> Ville : {{form.city}}</li>
<li> Code Postal : {{form.zip}}</li>
<li> Pays : {{form.country}}</li>
<li> Email : {{form.mail}}</li>
<li> Téléphone : {{form.phone}}</li>
{% endblock %}
<br></br>
<input type ="submit" name="_save" value="Valider la fiche individuelle" />
</form>
Pré公式化可视化
{%csrf_令牌%}
{%block content%}
在登记册上签字:
Civilité:{{form.title}
名称:{{form.lastname}
名称:{form.firstname}
Sexe:{{form.sex}
出生日期:{{表格.生日}
诞生之城:{{形式.出生地}
出生地:{form.birthcountry}
国家:{形式.国籍}
职业:{{form.job}
地址:{{form.address}
维尔:{{form.city}
邮政编码:{form.zip}
支付:{form.country}
电子邮件:{{form.mail}
电话:{{form.phone}
{%endblock%}
您的Test2视图是通过HttpResponseRedirect('toto')重定向到的视图吗?@RisulIslam我遇到了一个错误,因为我的全局变量不是int或string,而是object。如果要在保存表单之前验证表单,请将其放入表单类的验证方法中;这将发生在Test1中,Test2与验证无关。您将无法获取实例,因为视图函数中的变量存在于request->response
循环中。您可以在Redis中缓存提交的表单。谢谢您的回复。我想得到的是:用户正在HTML页面中填写表单。然后,他得到一份简历和两个选项:提交(数据保存在MySQL数据库中)或修改数据表单。第二个选项允许再次获取填写的表单,他可以修改一个或多个值,然后提交到数据库。然后,您应该在同一视图中处理所有这些,使用隐藏字段存储当前步骤。我正试图在同一视图中处理所有进程,正如您所说。为了获得未保存的数据,我还使用了commit=False
。你的曲目就是我想要的(初次提交/预览/编辑/最终提交)。我正在努力,但目前还没有结果。这是我第一次(两周内)使用Django,所以有些步骤仍然是黑魔法^^我用我的进度编辑了我的帖子。我只是在preview.html模板中阻止提交。提交按钮必须是
中的标签才能执行任何操作。而且,使用单个模板和在上下文t中传递标志的工作量可能会更少