Deal with undefined values in code or in the template?
Posted
by David
on Stack Overflow
See other posts from Stack Overflow
or by David
Published on 2010-05-24T04:40:25Z
Indexed on
2010/05/24
5:10 UTC
Read the original article
Hit count: 262
I'm writing a web application (in Python, not that it matters). One of the features is that people can leave comments on things. I have a class for comments, basically like so:
class Comment:
user = ...
# other stuff
where user
is an instance of another class,
class User:
name = ...
# other stuff
And of course in my template, I have
<div>${comment.user.name}</div>
Problem: Let's say I allow people to post comments anonymously. In that case comment.user
is None
(undefined), and of course accessing comment.user.name
is going to raise an error. What's the best way to deal with that? I see three possibilities:
- Use a conditional in the template to test for that case and display something different. This is the most versatile solution, since I can change the way anonymous comments are displayed to, say, "Posted anonymously" (instead of "Posted by ..."), but I've often been told that templates should be mindless display machines and not include logic like that. Also, other people might wind up writing alternate templates for the same application, and I feel like I should be making things as easy as possible for the template writer.
- Implement an accessor method for the
user
property of aComment
that returns a dummy user object when the real user is undefined. This dummy object would haveuser.name = 'Anonymous'
or something like that and so the template could access it and print its name with no error. - Put an actual record in my database corresponding to a user with
user.name = Anonymous
(or something like that), and just assign that user to any comment posted when nobody's logged in. I know I've seen some real-world systems that operate this way. (phpBB?)
Is there a prevailing wisdom among people who write these sorts of systems about which of these (or some other solution) is the best? Any pitfalls I should watch out for if I go one way vs. another? Whoever gives the best explanation gets the checkmark.
© Stack Overflow or respective owner