Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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
Python 在两个不同的函数中调用变量_Python_Django - Fatal编程技术网

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中传递标志的工作量可能会更少