web-dev-qa-db-fra.com

Vue personnalisée de Django dans la page d'administration

J'ai créé une vue personnalisée.

Comment puis-je insérer la vue dans l'admin? 

Pour une classe d'administrateur normale, nous pouvons simplement l'enregistrer sur le site d'administration:

class ListAdmin(admin.ModelAdmin):
   ...

admin.site.register(List, ListAdmin)

J'ai essayé de remplacer get_url dans admin.py, question_list est la vue:

class ListAdmin(admin.ModelAdmin):
    def list_view(self, request):
        return question_list(request)

    def get_urls(self):
        urls = super(ListAdmin, self).get_urls()
        list_urls = patterns('', r'^list/$', self.list_view())

        return list_urls + urls

admin.site.register(question_list, ListAdmin)

Ceci est la vue question_list:

def question_list(request):
    #questions = Question.objects.filter(topic__icontains = 1)
    questions = Question.objects.all()
    return render_to_response('admin/question_list.html', {'questions':questions})
question_list = staff_member_required(question_list)

J'obtiens 'fonction' n'est pas une erreur itérative.

Merci.

28
kelvin

Sur la base des informations que vous avez fournies, vous devriez vérifier cette partie de la documentation de Django:

Ajout de vues à des sites d’administration (note: le lien est valable pour la version 1.5 car la version 1.3 n’est plus prise en charge - la solution est toujours valide).

Ensuite, vous pouvez vérifier cet article de blog et cette question pour plus d’inspiration et de détails.


En vous basant sur votre exemple, je ne comprends vraiment pas pourquoi vous n'utilisez pas une constante ModelAdmin avec quelques options de filtrage :

class QuestionAdmin(admin.ModelAdmin):
    list_filter = ('topic',)
20
arie

Le modèle obtient une vue, pas le résultat de l'appel de la vue, c'est-à-dire:

list_urls = patterns('', r'^list/$', self.list_view())

devrait être

list_urls = patterns('', r'^list/$', self.list_view)

En outre, "list_view" (à ce stade) est une vue comme une autre. Il faudra donc retourner un objet HttpResponse.

def list_view(self, request):
    return question_list(request)

Vous n’affichez pas le code de question_list () mais j’ai le sentiment qu’il ne renvoie pas HttpResponse.

P.S .: Si vous fournissez la trace de l'objet "'fonction' n'est pas itérable" (vous obtenez ceci en visitant "liste /"?), Il y aurait moins de spéculation.

5
Danny W. Adair

Voici un exemple de tout ce dont vous avez besoin d'ajouter (à partir de Django 1.6) pour une page personnalisée qui sera liée à un bouton en regard du bouton "Historique" en haut à droite de la page de détail d'un objet:

https://Gist.github.com/mattlong/4b64212e096766e058b7

3
mateolargo

Vous devez remplacer get_urls dans votre sous-classe ModelAdmin.

0
Vasil