Перевод сообщений журнала администратора django

У меня есть небольшое приложение django mezzanine в https://github.com/miettinj/mezzanine Оно правильно переводит интерфейс администратора, но оно также должно переводить историю страниц в понятную форму. (Я предполагаю, что она поступает непосредственно из django_admin_log в базе данных)

Теперь журнал администратора выглядит следующим образом:

{
  "model": "admin.logentry",
  "pk": 2,
  "fields": {
    "action_time": "2022-11-18T08:34:03.136Z",
    "user": 1,
    "content_type": 18,
    "object_id": "1",
    "object_repr": "janes post",
    "action_flag": 2,
    "change_message": "[{\"changed\": {\"fields\": [\"Content\", \"Keywords\"]}}]"
  }
}

Как я могу изменить его так, чтобы он переводил действие 'changed', оставлял имена полей неизменными и полностью удалял непривлекательные символы: ("[{\) ?

Во вложении строки, обведенные синим цветом, являются правильными, а строки, обведенные знаком read, являются текущей функциональностью.enter image description here

Возможно, я поздно спохватился, но недавно у меня возник тот же вопрос.

Прежде всего, вы сначала показываете json (, который также является dict в python), который может быть легко разобран в python:

{
  "model": "admin.logentry",
  "pk": 2,
  "fields": {
    "action_time": "2022-11-18T08:34:03.136Z",
    "user": 1,
    "content_type": 18,
    "object_id": "1",
    "object_repr": "janes post",
    "action_flag": 2,
    "change_message": "[{\"changed\": {\"fields\": [\"Content\", \"Keywords\"]}}]"
  }
}

Это можно разобрать в python, чтобы сохранить только поле "change_message", либо рассматривая его как json-представление (двойной разбор JSON), либо как представление словаря:

Dict:

    data = {
  "model": "admin.logentry",
  "pk": 2,
  "fields": {
    "action_time": "2022-11-18T08:34:03.136Z",
    "user": 1,
    "content_type": 18,
    "object_id": "1",
    "object_repr": "janes post",
    "action_flag": 2,
    "change_message": "[{\"changed\": {\"fields\": [\"Content\", \"Keywords\"]}}]"
  }
}

change_message = data['fields']['change_message']

print(change_message)

На выходе получаем: [{"changed": {"fields": ["Содержание", "Ключевые слова"]}}]


JSON

import json

# Your JSON string
json_str = """
{
  "model": "admin.logentry",
  "pk": 2,
  "fields": {
    "action_time": "2022-11-18T08:34:03.136Z",
    "user": 1,
    "content_type": 18,
    "object_id": "1",
    "object_repr": "janes post",
    "action_flag": 2,
    "change_message": "[{\\"changed\\": {\\"fields\\": [\\"Content\\", \\"Keywords\\"]}}]"
  }
}
"""

# Parse the JSON string into a Python object
data = json.loads(json_str)

# Extract the 'change_message' field
change_message = data['fields']['change_message']

print(change_message)

На выходе получаем [{"changed": {"fields": ["Содержание", "Ключевые слова"]}}]


Окончательный разбор

Теперь, либо вы берете весь JSON-файл и разбираете его, чтобы взять "change_message", либо вы берете непосредственно "change_message" из LogEntry, тогда вам нужно будет дополнительно разобрать его и определить отображение, которое вы хотите. Вы можете сделать, например, так:

import json

# Your JSON string
json_str = "[{\"changed\": {\"fields\": [\"Content\", \"Keywords\"]}}]"

# Parse the JSON string into a Python object
parsed = json.loads(json_str)

# Extract 'fields' from 'changed' and join with a comma
fields = ', '.join(parsed[0]['changed']['fields'])

output = f"Changed: {fields}"

print(output)

На выходе получаем: Изменения: Содержание, Ключевые слова

Вернуться на верх