Неопределенная ошибка переменной при разбиении views.py на модули - Django - PullRequest
1 голос
/ 24 марта 2020

Мои коды в views.py становятся больше с каждым днем, и теперь я хочу разделить его на модули. Но у меня проблемы с переменными. Проблема в том, что я не могу объявить переменные или импортировать встроенные модули: в моем пользовательском модуле или views.py. Вот мои коды:

views.py:

@login_required(login_url='sign_in')
def result(request):
    find_by_fives()
    context = {
        'last_uploaded': last_uploaded,
        'words_count': words_count,
        'characters_count': characters_count
    }
    return render(request, 'result.html', context)

find_by_fives.py (это мой пользовательский модуль):

import glob 
from .models import OriginalDocument
from django.shortcuts import render

def find_by_fives():
    last_uploaded = OriginalDocument.objects.latest('id')

    original = open(str(last_uploaded.document), 'r')
    original_words = original.read().lower().split()
    words_count = len(original_words)

    open_original = open(str(last_uploaded.document), "r")
    read_original = open_original.read()
    characters_count = len(read_original)

    path = 'static/other_documents/doc*.txt'
    files = glob.glob(path)                       

Ошибка: NameError: name 'last_uploaded' is not defined

Примечание: это не весь мой взгляд, все, что я хочу знать, это просто где я должен объявить context, переменные и импорт.

1 Ответ

1 голос
/ 24 марта 2020

Хорошо, я вижу - "find_by_fives.py" - это функция, верно? Таким образом, переменные, которые вы объявляете внутри, живут только там. Поэтому, когда вы вызываете эту функцию из views.py - они объявляются, а затем, когда функция заканчивается, они удаляются. Если вы хотите использовать их в views.py - вы должны вернуть их и назначить там переменную, а затем передать их в контекст:

@login_required(login_url='sign_in')
def result(request):
   last_uploaded, words_count, characters_count = find_by_fives()
   context = {
       'last_uploaded': last_uploaded,
       'words_count': words_count,
       'characters_count': characters_count
   }
   return render(request, 'result.html', context)

def find_by_fives():
   last_uploaded = OriginalDocument.objects.latest('id')

   original = open(str(last_uploaded.document), 'r')
   original_words = original.read().lower().split()
   words_count = len(original_words)

   open_original = open(str(last_uploaded.document), "r")
   read_original = open_original.read()
   characters_count = len(read_original)

   path = 'static/other_documents/doc*.txt'
   files = glob.glob(path) 
   return last_uploaded, words_count, characters_count 
...