Kiwi
Kiwi

Reputation: 1185

Django Admin Kink with Collapse Fieldsets

I can't get the collapse fieldset to show in the admin controls. To top things off, I also get an error on load every now and then, which only seems to appear, whenever I am in the admin controls. I can't piece together the errors to surmise what causes the problem, but I only seem able to reproduce it when I include the included code in admin.py.

Admin Layout Error

Admin layout error

admin.py

from forum.models import Category, Thread, Post
from django.contrib import admin

class PostAdmin(admin.ModelAdmin):
  fieldsets = [
    (None, {'fields': ['author']}),
    (None, {'fields': ['thread']}),
    (None, {'fields': ['creation_date']}),
    (None, {'fields': ['content'], 'classes': ['collapse']}),
    (None, {'fields': ['is_removed']}),
    (None, {'fields': ['agrees'], 'classes': ['collapse']}),
    (None, {'fields': ['thanks'], 'classes': ['collapse']}),
    (None, {'fields': ['saves'], 'classes': ['collapse']}),
  ]

  admin.site.register(Post, PostAdmin)

(Occasional) Error

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 284, in run
    self.finish_response()
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 324, in finish_response
    self.write(data)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 403, in write
    self.send_headers()
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 467, in send_headers
    self.send_preamble()
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 385, in send_preamble
    'Date: %s\r\n' % http_date()
  File "C:\Python27\lib\socket.py", line 324, in write
    self.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 64523)
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 570, in __init__
    BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
  File "C:\Python27\lib\SocketServer.py", line 641, in __init__
    self.finish()
  File "C:\Python27\lib\SocketServer.py", line 694, in finish
    self.wfile.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine

Any ideas what might be causing this?

EDIT: Upon closer review, an error still persists, even when the collapsed fields are commented out. The layout problem may be related to this error or completely separate. I’d like to see both fixed, obviously.

Here is the seemingly different error:

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 284, in run
    self.finish_response()
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 324, in finish_response
    self.write(data)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 403, in write
    self.send_headers()
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 467, in send_headers
    self.send_preamble()
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 385, in send_preamble
    'Date: %s\r\n' % http_date()
  File "C:\Python27\lib\socket.py", line 324, in write
    self.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 50055)
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 570, in __init__
    BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
  File "C:\Python27\lib\SocketServer.py", line 641, in __init__
    self.finish()
  File "C:\Python27\lib\SocketServer.py", line 694, in finish
    self.wfile.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine

And the related admin.py:

from forum.models   import Category, Thread, Post
from django.contrib import admin

class ThreadAdmin(admin.ModelAdmin):
    "Thread layout in the admin control panel."

# Actions
    def admin_lock(self, request, queryset):
        rows_updated = queryset.update(is_locked=True)
        if rows_updated == 1:
            message_bit = "1 thread was"
        else:
            message_bit = "%s threads were" % rows_updated
        self.message_user(request, "%s successfully marked as locked" % message_bit)
    admin_lock.short_description = "Lock selected threads"

    def admin_unlock(self, request, queryset):
        rows_updated = queryset.update(is_locked=False)
        if rows_updated == 1:
            message_bit = "1 thread was"
        else:
            message_bit = "%s threads were" % rows_updated
        self.message_user(request, "%s successfully marked as unlocked" % message_bit)
    admin_unlock.short_description = "Unlock selected threads"

    def admin_remove(self, request, queryset):
        rows_updated = queryset.update(is_removed=True)
        if rows_updated == 1:
            message_bit = "1 thread was"
        else:
            message_bit = "%s threads were" % rows_updated
        self.message_user(request, "%s successfully marked as removed" % message_bit)
    admin_remove.short_description = "Remove selected threads"

    def admin_restore(self, request, queryset):
        rows_updated = queryset.update(is_removed=False)
        if rows_updated == 1:
            message_bit = "1 thread was"
        else:
            message_bit = "%s threads were" % rows_updated
            self.message_user(request, "%s successfully marked as restored" % message_bit)
    admin_restore.short_description = "Restore selected threads"

    actions        = ['admin_lock', 'admin_unlock',
                      'admin_remove', 'admin_restore']
    date_hierarchy =  'creation_date'
    list_display   = ('title', 'category', 'author',
                      'relative_date', 'creation_date')
    list_filter    = ('category',) # Doesn't work
    search_fields  = ['title', 'author']

class PostAdmin(admin.ModelAdmin):
    "Post layout in the admin control panel."

# Actions
    def admin_remove(self, request, queryset):
        rows_updated = queryset.update(is_removed=True)
        if rows_updated == 1:
            message_bit = "1 post was"
        else:
            message_bit = "%s posts were" % rows_updated
        self.message_user(request, "%s successfully marked as removed" % message_bit)
    admin_remove.short_description = "Remove selected posts"

    def admin_restore(self, request, queryset):
        rows_updated = queryset.update(is_removed=False)
        if rows_updated == 1:
            message_bit = "1 post was"
        else:
            message_bit = "%s posts were" % rows_updated
        self.message_user(request, "%s successfully marked as restored" % message_bit)
    admin_restore.short_description = "Restore selected threads"

    actions        = ['admin_remove', 'admin_restore']
    date_hierarchy =  'creation_date'
    list_display   = ('thread', 'author',
                      'relative_date', 'creation_date')
    list_filter    = ('thread',)
    search_fields  = ['thread', 'author']

admin.site.register(Category)
admin.site.register(Thread, ThreadAdmin)
admin.site.register(Post, PostAdmin)

Related Questions

  1. Django runserver error
  2. Error on display static content

Upvotes: 2

Views: 1849

Answers (1)

Alex Van Liew
Alex Van Liew

Reputation: 1369

The problem is this (and similar) lines:

(None, {'fields': ['agrees'], 'classes': ['collapse']}),

When the fieldset title is None, there is no fieldset title and thus nothing to click on to expand the fieldset. This comment in the Django bug tracker, albeit old, indicates that using no title and collapse is a Bad Idea (tm) and you "just shouldn't do that."

As for your other problem, there's a problem of some form with your OS. It just means that a connection (to your Python server) was made, but your computer (your host) terminated the connection before Python was done with it for some reason.

This problem is a bit old but it's still fairly high on the results for searches like "django fieldset collapse doesn't work", so I thought I might answer it for future searchers.

Upvotes: 4

Related Questions