Django personnalisée URL admin + vue pour filtre changelist liste personnalisée par tags
-
19-09-2019 - |
Question
Dans django admin je voulais mettre en place un filtre personnalisé par des balises (tags sont introduits avec django-marquage)
Je l'ai fait le ModelAdmin pour cela et il l'habitude de travailler très bien, en annexant URLconf personnalisé et modifier la vue changelist. Il devrait travailler avec les URL comme: http://127.0.0.1: 8000 / admin / commentaires / évaluation / seulement étiquetée Vista /
Mais maintenant, je reçois « invalide littérale int () avec la base 10: « Vista uniquement étiquetée », erreur qui signifie qu'il conserve correspondant à la page d'édition d'examen au lieu de la page de filtre personnalisé, et je ne peux pas comprendre pourquoi depuis il travaillait et je ne peux pas trouver ce que le changement aurait pu influer sur ce sujet.
Toute aide appréciée.
Code pertinent:
class ReviewAdmin(VersionAdmin):
def changelist_view(self, request, extra_context=None, **kwargs):
from django.contrib.admin.views.main import ChangeList
cl = ChangeList(request, self.model, list(self.list_display),
self.list_display_links, self.list_filter,
self.date_hierarchy, self.search_fields,
self.list_select_related,
self.list_per_page,
self.list_editable,
self)
cl.formset = None
if extra_context is None:
extra_context = {}
if kwargs.get('only_tagged'):
tag = kwargs.get('tag')
cl.result_list = cl.result_list.filter(tags__icontains=tag)
extra_context['extra_filter'] = "Only tagged %s" % tag
extra_context['cl'] = cl
return super(ReviewAdmin, self).changelist_view(request, extra_context=extra_context)
def get_urls(self):
from django.conf.urls.defaults import patterns, url
urls = super(ReviewAdmin, self).get_urls()
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.module_name
my_urls = patterns('',
# make edit work from tagged filter list view
# redirect to normal edit view
url(r'^only-tagged-\w+/(?P<id>.+)/$',
redirect_to,
{'url': "/admin/"+self.model._meta.app_label+"/"+self.model._meta.module_name+"/%(id)s"}
),
# tagged filter list view
url(r'^only-tagged-(P<tag>\w+)/$',
self.admin_site.admin_view(self.changelist_view),
{'only_tagged':True}, name="changelist_view"),
)
return my_urls + urls
Edit:. Question originale fixe
Je reçois maintenant « Impossible de filtrer une requête une fois une tranche a été prise. » pour la ligne:
cl.result_list = cl.result_list.filter(tags__icontains=tag)
Je ne sais pas où cette liste de résultats est coupé en tranches, avant filtre de balise est appliquée.
Edit2: Il est à cause de la self.list_per_page dans la déclaration ChangeList. Cependant n'a pas trouvé encore une solution appropriée. Temp fix:
if kwargs.get('only_tagged'):
list_per_page = 1000000
else:
list_per_page = self.list_per_page
cl = ChangeList(request, self.model, list(self.list_display),
self.list_display_links, self.list_filter,
self.date_hierarchy, self.search_fields,
self.list_select_related,
list_per_page,
self.list_editable,
self)
La solution
Vous manque un point d'interrogation avant le P '^only-tagged-(P<tag>\w+)/$'
, de sorte que l'expression ne correspond pas à.
Autres conseils
Dans l'exemple de code ci-dessus, (get_urls) est aligné de sorte qu'il ne fait pas partie de la classe ReviewAdmin mais plutôt une fonction distincte. Je suppose que cela peut causer votre problème si vous avez la même façon dans la source réelle.
L'erreur apparaît sur les étiquettes de plusieurs mots parce que vous devez faire correspondre un mot de balises. cela fonctionne: '- (? P [^ /] +) ^ seulement étiquetée / $' r