在两个不同的函数中调用变量

时间:2016-11-25 15:18:18

标签: python django

我问我怎样才能将函数1中定义的Python 2.7Django 1.10变量调用到函数2中。

我定义了一个function1

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)

我想在instance

中调用变量function2
def Test2(request) :

    identity = instance.lastname

    context = {
       "identity" : identity,
   }

    return render(request, 'test2_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" />

我只是在我的preview.html中使用提交按钮进行屏蔽,因为目前它还没有工作

2 个答案:

答案 0 :(得分:2)

简短的回答:你的要求是不可能的,期限。即使是全局变量也不起作用,因为没有任何保证两个请求都将由同一个过程提供服务(即便如此,还会有很多其他无法解决的问题)。

FWIW这实际上是我们在Web开发中大量使用数据库的原因之一 - 因此我们可以在请求之间保持状态(单用户桌面应用程序只能在会话的内存中保持状态)。

现在你在评论中提到

  

我不想从数据库中搜索,因为我想在验证之前获取数据恢复(类似缓存)。通过这种方式,我可以在提交之前控制数据表单

如果这是你想在两个观点之间分享instance的原因那么它就不是那样 - 你有form,表格DO有验证(&# 39; s实际上是django.forms - 验证用户提交的数据的主要原因),您可以hook into the validation process在不同的点执行任何额外的验证。 IOW:没有理由尝试在两个视图之间共享变量来验证表单。

编辑:好了,我们现在有了XY问题的X部分:

  

我想得到的是:用户正在填写HTML页面中的表单。然后,他获得了一个简历和2个选项:提交(在MySQL数据库中保存数据)或修改数据表单。第二个选项允许再次填充填充表单,他可以修改一个或多个值,然后提交到数据库

答案是:您不需要两个视图来处理案例,您只需跟踪当前的步骤&#34; (初始提交/预览/编辑/最终提交),这不是真正的火箭科学 - 这可以通过请求方法轻松完成(GET用于空表格,其他任何要求预览,编辑或最终提交)和提交按钮名称(以找出应执行哪个预览/编辑/最终提交操作)。您可以使用form.save(commit=False)获取未保存的实例(用于预览)。

答案 1 :(得分:0)

这是我如何通过@brunodesthuilliers解决我的问题:

我的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)

我的preview.html文件:

<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>