Я пытаюсь использовать django format_html_join () util, чтобы вернуть историю версии форматированной HTML для одной из моих моделей. Но я не могу получить format_html_join () , чтобы принять мой список словарей.
Вот что предполагает документация:
format_html_join(
"\n",
'[*]{id} {title}',
({"id": b.id, "title": b.title} for b in books),
)
< /code>
Этот третий аргумент предназначен для того, чтобы быть:
args_generator должен быть итератором, который дает аргументы для передачи в format_html (), любые последовательности позиционных аргументов или сопоставления аргументов ключевых слов. Я подумал, что список словарей иерсен. Я также думаю, что должен быть способ использовать список словарей в утилите, который ожидает список словарей без необходимости воссоздания списка словари. Вот метод модели, который я должен получить, чтобы получить историю версий: < /p>
@property # I have tried this as a property and not as a property, neither works
def get_version_history(self):
versions = Version.objects.get_for_object(self)
version_history = []
for version in versions:
history_fields = version.field_dict
hdict = {"question": history_fields['question'],
"answer": history_fields['answer'],
"user": version.revision.user.username,
"timestamp": version.revision.date_created.strftime("%Y-%m-%d %H:%M"),
}
version_history.append(hdict)
return version_history
< /code>
Этот метод возвращает что -то вроде этого: < /p>
[{'question': "I'm out of questions",
'answer': 'bye',
'user': 'test.supervisor',
'timestamp': '2025-07-31 20:19'},
{'question': "I'm out of questions",
'answer': 'me too',
'user': 'test.supervisor',
'timestamp': '2025-07-31 20:18'},
{'question': "I'm out of questions",
'answer': '',
'user': 'test.supervisor',
'timestamp': '2025-07-31 20:18'}]
< /code>
Теперь я пытаюсь вернуть форматированную версию HTML этого списка словарей: < /p>
def version_html(self):
html = format_html_join(
"\n",
"""
{question}
{answer}
{user}
{timestamp}
""",
self.get_version_history
)
return html
< /code>
Приведенный выше код возвращает эту ошибку: < /p>
File ~/.virtualenvs/cep/lib/python3.12/site-packages/django/utils/html.py:112, in format_html(format_string, *args, **kwargs)
110 args_safe = map(conditional_escape, args)
111 kwargs_safe = {k: conditional_escape(v) for (k, v) in kwargs.items()}
--> 112 return mark_safe(format_string.format(*args_safe, **kwargs_safe))
KeyError: 'question'
< /code>
Я пробовал различные вещи для третьего аргумента, все с различными ошибками: < /p>
self.get_version_history
self.get_version_history()
**self.get_version_history
**self.get_version_history()
{"question": v.question, "answer": v.answer, "user": v.user, "timestamp": v.timestamp,} for v in self.get_version_history())
({"question": v['question'], "answer": v['answer'], "user": v['user'], "timestamp": v['timestamp']} for v in self.get_version_history())
{"question": v.question, "answer": v.answer, "user": v.user, "timestamp": v.timestamp,} for v in self.get_version_history)
({"question": v['question'], "answer": v['answer'], "user": v['user'], "timestamp": v['timestamp']} for v in self.get_version_history)
(d for d in self.get_version_history)
(d for d in self.get_version_history())
[d for d in self.get_version_history]
[d for d in self.get_version_history()]
Я пытаюсь использовать django format_html_join () util, чтобы вернуть историю версии форматированной HTML для одной из моих моделей. Но я не могу получить format_html_join () , чтобы принять мой список словарей. Вот что предполагает документация: [code]format_html_join( "\n", '[*]{id} {title}', ({"id": b.id, "title": b.title} for b in books), ) < /code> Этот третий аргумент предназначен для того, чтобы быть: args_generator должен быть итератором, который дает аргументы для передачи в format_html (), любые последовательности позиционных аргументов или сопоставления аргументов ключевых слов. Я подумал, что список словарей иерсен. Я также думаю, что должен быть способ использовать список словарей в утилите, который ожидает список словарей без необходимости воссоздания списка словари. Вот метод модели, который я должен получить, чтобы получить историю версий: < /p> @property # I have tried this as a property and not as a property, neither works def get_version_history(self): versions = Version.objects.get_for_object(self) version_history = [] for version in versions: history_fields = version.field_dict hdict = {"question": history_fields['question'], "answer": history_fields['answer'], "user": version.revision.user.username, "timestamp": version.revision.date_created.strftime("%Y-%m-%d %H:%M"), } version_history.append(hdict) return version_history < /code> Этот метод возвращает что -то вроде этого: < /p> [{'question': "I'm out of questions", 'answer': 'bye', 'user': 'test.supervisor', 'timestamp': '2025-07-31 20:19'}, {'question': "I'm out of questions", 'answer': 'me too', 'user': 'test.supervisor', 'timestamp': '2025-07-31 20:18'}, {'question': "I'm out of questions", 'answer': '', 'user': 'test.supervisor', 'timestamp': '2025-07-31 20:18'}] < /code> Теперь я пытаюсь вернуть форматированную версию HTML этого списка словарей: < /p> def version_html(self):
html = format_html_join( "\n", """ {question} {answer} {user} {timestamp} """, self.get_version_history ) return html < /code> Приведенный выше код возвращает эту ошибку: < /p> File ~/.virtualenvs/cep/lib/python3.12/site-packages/django/utils/html.py:112, in format_html(format_string, *args, **kwargs) 110 args_safe = map(conditional_escape, args) 111 kwargs_safe = {k: conditional_escape(v) for (k, v) in kwargs.items()} --> 112 return mark_safe(format_string.format(*args_safe, **kwargs_safe))
KeyError: 'question' < /code> Я пробовал различные вещи для третьего аргумента, все с различными ошибками: < /p> self.get_version_history self.get_version_history()
{"question": v.question, "answer": v.answer, "user": v.user, "timestamp": v.timestamp,} for v in self.get_version_history()) ({"question": v['question'], "answer": v['answer'], "user": v['user'], "timestamp": v['timestamp']} for v in self.get_version_history())
{"question": v.question, "answer": v.answer, "user": v.user, "timestamp": v.timestamp,} for v in self.get_version_history) ({"question": v['question'], "answer": v['answer'], "user": v['user'], "timestamp": v['timestamp']} for v in self.get_version_history)
(d for d in self.get_version_history) (d for d in self.get_version_history())
[d for d in self.get_version_history] [d for d in self.get_version_history()]