У меня проблема со страницей, работающей на Django 2.1. Моя проблема в том, что когда вызывается функция из views.py для заполнения шаблона, экземпляр класса кажется кэшированным. Каждый последующий вызов этой функции / каждое обновление этой страницы показывает старые данные за предыдущий раз, когда эта страница / функция была вызвана.
Код, о котором идет речь:
projectroot / MyApp / шаблоны / MyApp / bar.html
#this is bar.html
{{ MyTable.DataColumns }}
<br>
{{ MyTable.DataRows }}
projectroot / MyApp / views.py
#this is a relevant snippet from views.py
#There isn't anything outside of the functions,
#with imports being the exception to this rule
import myownpackage.DataTable import DataTable
def list_page(request):
template = 'foo/bar.html'
connection = a_connection_here
query_results = connection.get_query_results(sql_query_here)
list_of_rows = [x for x in query_results]
dt = DataTable()
dt.DataColumns = [list_of_columns_here]
for each_row in list_of_rows:
dt.add(each_row)
return_dict = {"MyTable": dt}
return render(request, template, return_dict)
projectroot / myownpackage / DataTable.py
class DataTable:
DataColumns = []
DataRows = []
def add(self, data_row):
if len(self.DataColumns) != len(data_row):
raise IndexError("Target column count does not match DataTable's DataColumn count.")
else:
self.DataRows.append(data_row)
def remove(self, index):
self.DataRows.remove(index)
При первой загрузке этой страницы, foo / bar.html кажется именно тем, что я хочу. Я вижу столбцы, напечатанные на странице, и несколько строк в этой таблице.
Проблема видна, если вы обновите страницу. Это как если бы dt кэшировалось после того, как функция вернула render ().
Когда вы обновите страницу, вы увидите столбцы и строки из первого запроса, дублированные! Если мы обновим в третий раз, мы увидим третий набор тех же строк! Это добавление DataTable продолжается столько раз, сколько вы обновляете. Ясно, что dt сохраняется вне этой функции после создания экземпляра внутри функции, и я не уверен, почему или как это происходит.
ПРИМЕЧАНИЕ: только строки добавляются снова и снова. Столбцы остаются прежними. Это связано с тем, что столбцы устанавливаются в таблице, а строки добавляются .
Вещи, которые я пробовал:
После того, как dt назначено этому return_dict, я попытался dt = Нет и del dt . Ничего из этого не помогло, и при обновлении страницы были показаны те же результаты.
Мои вопросы к переполнению стека:
Почему экземпляр DataTable с именем dt не удаляется после возврата из функции?
Если это (по какой бы то ни было причине) нормально, что я могу сделать, чтобы уничтожить этот экземпляр DataTable, когда я закончу с ним?