kelvin
kelvin

Reputation: 291

Django custom view into admin page

I have created a custom view.

How can I insert the view into the admin?

For a normal admin class, we can just simply register it to the admin site:

class ListAdmin(admin.ModelAdmin):
   ...

admin.site.register(List, ListAdmin)

I tried to override get_url in admin.py, question_list is the view:

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)

This is the question_list view:

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)

I get 'function' object is not iterable error.

Thanks.

Upvotes: 29

Views: 59003

Answers (4)

arie
arie

Reputation: 18972

Based on the information you provided you should check this part of Django's documentation:

Adding views to admin sites (note: the link is valid for version 1.5 since version 1.3 is not supported anymore - the solution is still valid).

Then you could check this blog post and this question for some further inspiration and details.


Based on your example I really don't get why you just don't use a regular ModelAdmin with some filtering options:

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

Upvotes: 21

mateolargo
mateolargo

Reputation: 1022

Here's an example of everything needed to add (as of Django 1.6) for a custom page that will be linked to from a button next to the "History" button in the top right of an object's detail page:

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

Upvotes: 3

Danny W. Adair
Danny W. Adair

Reputation: 12968

The pattern gets a view, not the result of calling the view, i.e.:

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

should be

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

Also, "list_view" (at this stage) is a view like any other. So it will need to return an HttpResponse object.

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

You're not showing the code for question_list() but I have the suspicion it is not returning an HttpResponse.

P.S.: If you provided the traceback of the "'function' object is not iterable" exception (you're getting this when visiting "list/" ?) there'd be less guesswork.

Upvotes: 6

Vasil
Vasil

Reputation: 38116

You should override get_urls in you ModelAdmin subclass.

Upvotes: 0

Related Questions