Re: Accessing request.user in a ModelAdmin function

469 views
Skip to first unread message

Melvyn Sopacua

unread,
Jun 14, 2012, 11:33:34 AM6/14/12
to django...@googlegroups.com
On 14-6-2012 13:04, Paulo Almeida wrote:

> So then I could just add "is_endorsed" to the list_display variable to have
> the endorsement status for that user in the Speaker list, in the Admin
> site. Of course, this doesn't work because request isn't available in the
> is_endorsed function. I googled around and saw solutions for similar
> problems involving overrides of save_model, queryset or
> formfield_for_manytomany, but I couldn't adapt them to list_display,
> because I'm creating a function in the ModelAdmin, where I only know how to
> pass self and obj. Suggestions?

In 1.4 you have ModelAdmin.list_filter and can subclass
SimpleListFilter. These get passed the request and the documentation
provides a full example of what you're trying to do.

--
Melvyn Sopacua

Paulo Almeida

unread,
Jun 14, 2012, 12:09:58 PM6/14/12
to django...@googlegroups.com
Hi Melvyn,

I've only been reading the Django 1.2 docs, because it's what's immediately available in my Linux distribution, but that would be an excellent reason to upgrade, if I can get it to work. 

Thanks,
Paulo

Paulo Almeida

unread,
Jun 14, 2012, 12:53:13 PM6/14/12
to django...@googlegroups.com
Hi again,

From what I read in the 1.4 docs, the SimpleListFilter example is for list_filter and not list_display. To clarify what I wrote before, if a user endorses Speaker A and opposes Speaker B, I want the Speaker list in the admin site to show:

|Name | Is endorsed |
|    A   |     True        |
|    B   |      False     |

Having a filter on "Is Endorsed" might be a nice addition, but the main goal is to have that table. Would there be a way to get the result of a SimpleListFilter into a callable that can be used in list_display? I didn't see that in the docs, and it's not obvious to me how to do it.

Thanks,
Paulo

Alireza Savand

unread,
Jun 14, 2012, 1:26:46 PM6/14/12
to django...@googlegroups.com


On Thursday, June 14, 2012 3:04:54 PM UTC+4, Paulo Almeida wrote:
Hi,

I would like to access the request.user in a ModelAdmin function, so I can filter the results of a query based on the logged in user. I have these models:

class Speaker(models.Model):
    name = models.CharField(max_length=50)
    endorsements = models.ManyToManyField(User,
                                                                    through="Endorsement")

class Endorsement(models.Model):
    speaker = models.ForeignKey('Speaker')
    user = models.ForeignKey(User)
    endorsed = models.NullBooleanField()

    class Meta:
        unique_together = ("speaker", "user")

User comes from django.contrib.auth.models. In the ModelAdmin, I would like to have this:

class SpeakerAdmin(admin.ModelAdmin):
    def is_endorsed(self, obj):
       
        endorsement = Endorsement.objects.get(speaker=obj,
                                                              user=request.user)
        return endorsement.endorsed


So then I could just add "is_endorsed" to the list_display variable to have the endorsement status for that user in the Speaker list, in the Admin site. Of course, this doesn't work because request isn't available in the is_endorsed function. I googled around and saw solutions for similar problems involving overrides of save_model, queryset or formfield_for_manytomany, but I couldn't adapt them to list_display, because I'm creating a function in the ModelAdmin, where I only know how to pass self and obj. Suggestions?

Thanks,
Paulo Almeida

I think you looking for this app
Small piece of middleware to be able to access authentication data from
 everywhere in the django code.

Right ?

Alireza Savand

unread,
Jun 14, 2012, 1:30:01 PM6/14/12
to django...@googlegroups.com

And if it's just for logged-in user, you can
do like
at the ModelAdmin

Paulo Almeida

unread,
Jun 14, 2012, 1:35:41 PM6/14/12
to django...@googlegroups.com
Hi Alireza,

Yes, that did the trick!

Thank you,
Paulo
Reply all
Reply to author
Forward
0 new messages