#25396: ModelAdmin.get_queryset doesn't accept ValueQuerySet
-------------------------------+--------------------
     Reporter:  dex4er         |      Owner:  nobody
         Type:  New feature    |     Status:  new
    Component:  contrib.admin  |    Version:  master
     Severity:  Normal         |   Keywords:
 Triage Stage:  Unreviewed     |  Has patch:  1
Easy pickings:  0              |      UI/UX:  0
-------------------------------+--------------------
 Django Admin crashes for following code:


 models.py

 {{{
 from django.db import models
 from django.contrib.auth.models import User


 class Category(models.Model):
     name = models.CharField(max_length=100)

     class Meta:
         verbose_name_plural = 'categories'

     def __unicode__(self):
         return self.name


 class Note(models.Model):
     user = models.ForeignKey(User)
     category = models.ForeignKey(Category)
     keywords = models.CharField(max_length=400)
     title = models.CharField(max_length=200)
     date = models.DateTimeField()
     content = models.TextField(max_length=50000)

     def __unicode__(self):
         return self.title


 class UserNotesReport(models.Model):
     user = models.CharField(max_length=30, primary_key=True)
     category = models.CharField(max_length=100, primary_key=True)
     n = models.IntegerField()
 }}}

 admin.py

 {{{
 from django.contrib import admin

 import hello_blog.models as models

 from django.db.models import Count


 class CategoryAdmin(admin.ModelAdmin):
     pass

 admin.site.register(models.Category, CategoryAdmin)


 class NoteAdmin(admin.ModelAdmin):
     pass

 admin.site.register(models.Note, NoteAdmin)


 class UserNotesReportAdmin(admin.ModelAdmin):
     actions = None
     list_display = ['user__username', 'category__name', 'n']
     list_display_links = None
     readonly_fields = ['user', 'category', 'n']

     def user__username(self):
         pass

     def category__name(self):
         pass

     def get_queryset(self, request):
         qs = models.Note.objects.order_by('user',
 'category').values('user__username',
 'category__name').annotate(n=Count('*'))
         print(qs.query)
         return qs

     def has_add_permission(self, request):
         return False

 admin.site.register(models.UserNotesReport, UserNotesReportAdmin)
 }}}


 The fix is trivial:

 {{{
 diff --git a/django/contrib/admin/templatetags/admin_list.py
 b/django/contrib/admin/templatetags/admin_list.py
 index f4033e2..9e70f8c 100644
 --- a/django/contrib/admin/templatetags/admin_list.py
 +++ b/django/contrib/admin/templatetags/admin_list.py
 @@ -199,7 +199,10 @@ def items_for_result(cl, result, form):
          empty_value_display = cl.model_admin.get_empty_value_display()
          row_classes = ['field-%s' % field_name]
          try:
 -            f, attr, value = lookup_field(field_name, result,
 cl.model_admin)
 +            if isinstance(result, dict):
 +                f, attr, value = None, field_name, result.get(field_name)
 +            else:
 +                f, attr, value = lookup_field(field_name, result,
 cl.model_admin)
          except ObjectDoesNotExist:
              result_repr = empty_value_display
          else:
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/25396>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.b97c3b59caa18a8febd09443d6d26851%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to