KnewB
KnewB

Reputation: 363

Should I pass a dictionary to my template?

Being a newb I'm trying to work out what belongs where. I've got a ListView to list all users in the system, and it includes a get_queryset method -something along the lines of:

def get_queryset(self):
    users = []
    for user in User.objects.all(): 
        a_user = {}            
        a_user['username'] = user.username
        a_user['full_name'] = user.get_full_name()
        a_user['num_of_friends'] = len(user.friends.all())  
        a_user['phone_num'] = user.get_profile().phone_num

        a_user['has_subscription'] = bool(Subscription.objects.filter(subscriber=self.request.user))

        users.append(a_user)
    return users

So rather than returning a queryset of users I'm making this dictionary out of various chosen attributes of each user, and what a template designer gets is limited to only what I think they should have.

Is it better practice to instead pass user objects to the template, and let the template writer get whatever they need from them? I suppose the answer is Yes.

But, when it comes to the a_user['has_subscription'] line above, I assume the answer becomes No?

Upvotes: 0

Views: 96

Answers (2)

acjay
acjay

Reputation: 36511

The way you've done it is totally fine. I've found it to be useful to separate my templates from my model by explicitly providing the information needed by the template in the view, which is essentially what you've done. It's a little bit weird to not be returning an actual queryset from a method called get_queryset, but I've also come to the conclusion based on criticisms like this that class-based views as they are currently implemented in Django should be considered a means to an end, as opposed to a dogmatic way of organizing your view code. The abstraction simply isn't as clean as say, the Django ORM.

If you really wanted something a little slicker, you could try using the values method to narrow your queryset, with an annotation to add in the subscription count. But there's probably not much point.

Upvotes: 1

ono
ono

Reputation: 3102

It depends on what you're trying to do with the array 'users'. Someone editing the template can only style and display the data in a certain way. The get_queryset function can provide the data for the template.

Upvotes: 0

Related Questions