Ошибка имени в Django — Вложенная функция в функции Views — сохранение в базе данных

#python #django #function #nested #nested-function

#python #django #функция #вложенный #вложенная функция

Вопрос:

Используя Django, при попытке сохранить ответы от пользователя в базе данных, он показывает мне ошибку имени. Я вложил функцию в функцию views, она работает правильно, когда я не пытаюсь сохранить данные в базе данных. Но как только я пытаюсь вставить код внутри функции views для сохранения данных, он выдает эту ошибку имени. Ниже приведены файлы с кодом,

models.py файл

 from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User 

class ansquestions(models.Model):
    m_invested = models.CharField(max_length=100)
    p_return = models.CharField(max_length=100)
    years = models.CharField(max_length=100)
    inflation_yes_no = models.CharField(max_length=100)
    r_output = models.TextField(default=True)
    date_answered = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
  

forms.py файл

 from django import forms
from .models import ansquestions

class ansquestionsForm(forms.ModelForm):
    class Meta:
        model = ansquestions
        fields = ['m_invested', 'p_return', 'years', 'inflation_yes_no', 'r_output', 'date_answered', 'author'

]
  

views.py файл (Примечание : функция fvinvestment вложена в функцию investmentfvcalc. при вставке сюда она не отображается как с отступом в investmentfvcalc , но в моем реальном коде функция fvinvestment имеет отступ и вложена в функцию investmetncalc . )

 from django.shortcuts import render
#from django.http import HttpResponse
from .models import ansquestions
from .forms import ansquestionsForm


def investmentfv(request):
    idata = { 'tmi':tmi, 'pry':pry, 'ys':ys, 'qinf':qinf }
    return render(request, 'fvalueapp/investmentfv.html', idata)




 def investmentfvcalc(request):
    if request.method == 'POST':
        form = ansquestionsForm(request.POST)
        if form.is_valid():
            total_i = request.POST.get["m_invested", '']
            perc_r = request.POST.get["p_return", '']
            years_i = request.POST.get["years", '']
            makeup_infl = request.POST.get["inflation_yes_no", '']
            ansquestions_obj = ansquestions(m_invested=total_i, p_return=perc_r, years=years_i, inflation_yes_no=makeup_infl)
            ansquestions_obj.save() 

            

def fvinvestment():
        global fv_i_value
        global r_output
        #global makeup_infl ( global variable might be needed for technique for above. as error says makeup_inf is not defined ) 
        if makeup_infl=='no':
            i_return = (float(perc_r))
        elif makeup_infl=='yes' and int(years_i)<=5:
            i_return = (2 float(perc_r))
        elif makeup_infl=='yes' and int(years_i)>5 and int(years_i)<=9.99 :
            i_return = (4   float(perc_r))
        elif makeup_infl=='yes' and int(years_i)>= 10 :    
            i_return = ( 6   float(perc_r))
                
        
        fv_i_value = int(total_i) * (1   (i_return)*.01) ** int(years_i)

        r_output = 'Your money would grow to the total of '   str(fv_i_value)  ' dollars at the end of this timeframe.'                     
        
    
    fvinvestment()   


  

  

    
idata = { 'tmi':tmi, 'pry':pry, 'ys':ys, 'qinf':qinf, 'r_output': r_output }
return render (request, 'fvalueapp/fvinvestmentcalcresults.html', idata)
  

Ошибки :

Запуск приведенного выше кода выдает ошибку «Ошибка имени в investmentfv / Investmentfvcalc» «свободная переменная ‘makeup_infl’, на которую ссылаются перед назначением во включающей области » я бы позже поместил переменную «makeup_infl» в качестве глобальной переменной в функции fvinvestment, это привело бы к ошибке «Ошибка имени ‘makeup_infl’не определено

Комментарии:

1. Вы не должны вызывать подобную функцию в views.py и ожидайте, что это сработает. Django направляет веб-запросы к одной функции просмотра. Если вы хотите получить более подробную информацию об ошибке, вам также следует скопировать полную обратную трассировку ошибки NameError, о которой идет речь.

2. Обновление: я забыл добавить код для сохранения данных, который вызывает ошибку, сейчас он там.

3. @edgars Также запускает приведенный выше код, он выдает мне ошибку «Ошибка имени в investmentfv / Investmentfvcalc» «свободная переменная ‘makeup_infl’, на которую ссылаются перед присвоением во включающей области » я бы позже поместил переменную «makeup_infl» в качестве глобальной переменной в функции fvinvestment, это привело бы к ошибке «NameError — name’makeup_infl’ не определен

4. Важно: функция fvinvestment вложена в функцию investmentfvcalc . при вставке сюда он не отображается как indeneted в investmentfvcalc , но в моем реальном коде функция fvinvestment имеет отступ и вложена в функцию investmetncalc .

5. Вложение функции view в другую функцию view противоречит рекомендациям django, и, честно говоря, неудивительно, что это приводит к ошибкам области видимости. Вместо этого полностью разделите свои представления или, возможно, напишите представление на основе классов и поместите логику из вашего вложенного представления в его методы.

Ответ №1:

Измените fvinvestment на глобальную область видимости, передайте эти переменные: years_i и makeup_infl

 def fvinvestment(years_i, makeup_infl):
    ....
  

Это также решит вашу ошибку makeup_infl not defined

Комментарии:

1. Здравствуйте, спасибо за ваш ответ. Когда вы говорите, что переводите fvinvestment в глобальную область видимости, вы имеете в виду, что не используете это как вложенную функцию и не выделяете функцию fvinvestement, чтобы она сама по себе была отдельной функцией?

2. Да, это то, что я имел в виду. Вложенные функции представления не являются хорошей практикой в представлениях Django