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

2024-04-27 05:28:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在问如何将函数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)

我想调用我的function2中的变量instance

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)

那个预览.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" />

我只是用我电脑里的提交按钮阻止预览.html因为就目前而言,这是行不通的


Tags: nameformreturnifisrequestsavedef
2条回答

简而言之:你的要求是不可能的,句号。即使是一个全局变量也不起作用,因为没有任何东西可以保证两个请求将由同一个进程提供服务(即使这样,也会有许多其他无法解决的问题)。你知道吗

FWIW这实际上是我们在web开发中大量使用数据库的原因之一—因此我们可以在请求之间保持状态(其中单用户桌面应用程序可以将状态保存在内存中以用于会话)。你知道吗

现在你在评论中提到

I don't want to search from database because I want to get a data resume (something like cache) before to validate it. In this way, I can control data form before submission

如果这就是您希望在两个视图之间共享instance的原因,那么这不是方法—您有一个form,表单确实有验证(这实际上是django.forms验证用户提交的数据的主要原因),并且您可以hook into the validation process在不同的点执行任何额外的验证。IOW:没有理由尝试在两个视图之间共享一个变量来验证表单。你知道吗

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

What I would like to get is : user are filling a form in a HTML page. Then, he gets a resume and 2 options : submit (with data saving in MySQL database) or modify data form. The second option lets to get one more time the filled form and he can modify one or several values, then submit to database

答案是:你不需要两个视图来处理这个案例,你只需要跟踪当前的“步骤”(初始提交/预览/编辑/最终提交),这并不是真正的火箭科学-这很容易用request方法完成(GET代表一个空表单,其他任何东西都要求预览,编辑或最终提交)和提交按钮名称(以确定应执行哪些预览/编辑/最终提交操作)。您可以使用form.save(commit=False)获取未保存的实例(用于预览)。你知道吗

感谢@brunodesshuilliers:

我的视图.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)

我的预览.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>

相关问题 更多 >