Я пишу веб-приложение (на Python это не так важно). Одной из особенностей является то, что люди могут оставлять комментарии к вещам. У меня есть класс для комментариев, в основном так:
class Comment:
user = ...
# other stuff
где user
- это экземпляр другого класса,
class User:
name = ...
# other stuff
И, конечно, в моем шаблоне у меня есть
<div>${comment.user.name}</div>
Проблема: допустим, я разрешаю людям оставлять комментарии анонимно. В этом случае comment.user
равен None
(не определено), и, конечно, доступ к comment.user.name
вызовет ошибку. Какой лучший способ справиться с этим? Я вижу три возможности:
- Используйте условное выражение в шаблоне для проверки этого случая и отобразите что-то другое. Это наиболее универсальное решение, поскольку я могу изменить способ отображения анонимных комментариев, скажем, «Размещено анонимно» (вместо «Написано ...»), но мне часто говорили, что шаблоны должны отображаться бездумно машины и не включают в себя логику, как это. Кроме того, другие люди могли бы написать альтернативные шаблоны для того же приложения, и я чувствую, что должен максимально упростить процесс создания шаблонов.
- Реализуйте метод доступа для свойства
user
Comment
, которое возвращает фиктивный объект пользователя, когда реальный пользователь не определен. Этот фиктивный объект будет иметь user.name = 'Anonymous'
или что-то подобное, и поэтому шаблон сможет получить к нему доступ и напечатать его имя без ошибок.
- Поместите фактическую запись в мою базу данных, соответствующую пользователю с
user.name = Anonymous
(или что-то в этом роде), и просто назначьте этого пользователя любому комментарию, опубликованному, когда никто не вошел в систему. Я знаю, что видел некоторые реальные системы которые действуют таким образом. (PHPBB?)
Есть ли преобладающая мудрость среди людей, которые пишут такого рода системы, о том, какая из них (или какое-то другое решение) является лучшей? Любые подводные камни, которые я должен остерегаться, если я иду один путь против другого? Тот, кто дает лучшее объяснение, получает галочку.