Python 3.5.1

Не могли бы вы взглянуть на код и картинку.

Это какой-то код Django, но вопрос касается Python.

Я получаю ошибку:

Exception Value:    
name 'objects' is not defined
Exception Location:
/home/michael/workspace/pharchive/pharchive/general/templatetags/md_aux.py in get_aux_info, line 17

Строка 17 - это context = Context ({"объекты": объекты}). На картинке это видно.

Я пробовал добавить objects = [] чуть выше. Но это не помогло. В этом случае объекты действительно были пустыми. Итак, я это закомментировал.

Что ж, на скриншоте видно, что мы получим, если остановимся на точке останова. Мы видим, что объекты var действительно доступны в контексте. И в нем что-то есть.

В любом случае, я застрял с переменной областью видимости.

Я не понимаю: 1. Почему objects = [] мне не помогли. 2. Почему я получаю эту ошибку, когда объекты доступны.

Не могли бы вы дать мне удар здесь?

@register.simple_tag
def get_aux_info(master_document, aux_type):    
    md = MasterDocument.objects.get(pk=master_document)
    template = get_template("general/md_tags.html")

    #objects = []
    code = "objects = md." + aux_type +"s.all()"
    exec(code)
    context = Context({"objects": objects})
    return template.render(context)

0
Michael 25 Июн 2016 в 10:53
Почему вы используете exec? Разве objects = getattr(md, aux_type + 's').all() не справился бы с этой работой?
 – 
jonrsharpe
25 Июн 2016 в 11:19
Я сам справился с exec. Ну, гетатра в моем арсенале не было. Теперь есть. Спасибо . Если вы сформируете его как ответ, я с радостью его приму.
 – 
Michael
25 Июн 2016 в 11:22

1 ответ

Лучший ответ

Намного более простой подход, чем создание и exec использование кода в виде строки, - это доступ к атрибуту с помощью встроенного getattr. Это проясняет, что происходит, и полностью устраняет текущие проблемы с областью действия:

objects = getattr(md, aux_type + 's').all()

Python имеет обширную поддержку такого рода самоанализа; использование execeval) обычно является предупреждением о том, что вы приближаетесь к чему-то не так.

0
jonrsharpe 25 Июн 2016 в 11:28