[GH-ISSUE #1561] Bug: Crash when viewing snapshot admin page (Server Error (500)) on latest dev branch -- AttributeError: module 'django.forms.forms' has no attribute 'JSONField' #930

Closed
opened 2026-03-01 14:47:22 +03:00 by kerem · 2 comments
Owner

Originally created by @nguyenmp on GitHub (Oct 21, 2024).
Original GitHub issue: https://github.com/ArchiveBox/ArchiveBox/issues/1561

Describe the bug

When I visit the admin snapshot page, archivebox returns Server Error 500. I think there's a small typo introduced in github.com/ArchiveBox/ArchiveBox@f75ae805f8 (diff-29838f94de) where JSONField should be from models rather than forms or something like that. Maybe from django.db.models import JSONField? I tried massaging the code a bit but didn't get anywhere.

Steps to reproduce

For example:

  1. Log in as admin
  2. Make a snapshot and click the snapshot timestamp to go to the admin page

Screenshots or log output

django.request Internal Server Error: /admin/core/snapshot/6cb793e5-3d34-4350-b58e-56a1c4aeff4a/change/
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 518, in thread_handler
    raise exc_info[1]
  File "/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py", line 42, in inner
    response = await get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 518, in thread_handler
    raise exc_info[1]
  File "/usr/local/lib/python3.11/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
    response = await wrapped_callback(
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 468, in __call__
    ret = await asyncio.shield(exec_coro)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/asgiref/current_thread_executor.py", line 40, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 522, in thread_handler
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 718, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 188, in _view_wrapper
    result = _process_exception(request, e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 186, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/views/decorators/cache.py", line 80, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/sites.py", line 241, in inner
    return view(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/archivebox/abid_utils/admin.py", line 126, in change_view
    return super().change_view(request, object_id, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django_object_actions/utils.py", line 60, in change_view
    return super(BaseDjangoObjectActions, self).change_view(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1964, in change_view
    return self.changeform_view(request, object_id, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 48, in _wrapper
    return bound_method(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 188, in _view_wrapper
    result = _process_exception(request, e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 186, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1820, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1893, in _changeform_view
    formsets, inline_instances = self._create_formsets(
                                 ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 2332, in _create_formsets
    for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args):
  File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 937, in get_formsets_with_inlines
    yield inline.get_formset(request, obj), inline
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/archivebox/core/admin_archiveresults.py", line 86, in get_formset
    formset.form.base_fields['cmd'] = forms.JSONField(initial=['-'])
                                      ^^^^^^^^^^^^^^^
AttributeError: module 'django.forms.forms' has no attribute 'JSONField'

ArchiveBox version

ArchiveBox v0.8.5rc50 COMMIT_HASH=2227d22 BUILD_TIME=2024-10-21 17:04:25 1729530265
IN_DOCKER=True IN_QEMU=False ARCH=aarch64 OS=Linux PLATFORM=Linux-6.10.4-linuxkit-aarch64-with-glibc2.36 PYTHON=Cpython
EUID=911:0 UID=911:0 PUID=911:0 FS_UID=911:0 FS_PERMS=644 FS_ATOMIC=True FS_REMOTE=True
DEBUG=False IS_TTY=True SUDO=False ID=f16edbfc:ca598960 SEARCH_BACKEND=sonic LDAP=False

 Binary Dependencies:
 √  python                3.11.10      sys_pip    /usr/local/bin/python3.11
 √  django                5.1.2        sys_pip    /usr/local/lib/python3.11/site-packages/django/__init__.py
 √  sqlite                2.6.0        sys_pip    /usr/local/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py
 √  pip                   24.0.0       sys_pip    /usr/local/bin/pip
 √  pipx                  1.1.0        sys_pip    /usr/bin/pipx
 √  node                  22.10.0      apt        /usr/bin/node
 √  npm                   10.9.0       apt        /usr/bin/npm
 √  npx                   10.9.0       apt        /usr/bin/npx
 √  playwright            1.48.0       sys_pip    /usr/local/bin/playwright
 √  puppeteer             23.6.0       lib_npm    ~/.npm/bin/puppeteer
 √  ldap                  3.4.4        sys_pip    /usr/local/lib/python3.11/site-packages/ldap/__init__.py
 √  rg                    13.0.0       apt        /usr/bin/rg
 √  sonic                 1.4.9        env        /usr/local/bin/sonic
 √  chrome                130.0.6723   env        /usr/bin/chromium-browser
 √  curl                  8.10.1       apt        /usr/bin/curl
 √  git                   2.39.5       apt        /usr/bin/git
 √  postlight-parser      2.2.3        sys_npm    ~/.npm/bin/postlight-parser
 √  readability-extractor 0.0.11       lib_npm    ~/.npm/bin/readability-extractor
 √  single-file           1.1.54       lib_npm    ~/.npm/bin/single-file
 √  wget                  1.21.3       apt        /usr/bin/wget
 √  yt-dlp                2024.10.7    sys_pip    /usr/local/bin/yt-dlp
 √  ffmpeg                5.1.6        env        /usr/bin/ffmpeg

 Package Managers:
 √  env         /usr/bin/which                                       UID=911  PATH=~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 √  apt         /usr/bin/apt-get                                     UID=0    PATH=/usr/bin:/bin
 -  brew        not available                                        UID=911  PATH=
 √  sys_pip     /usr/local/bin/pip                                   UID=911  PATH=/usr/bin:~/.local/bin:/usr/local/bin
 -  venv_pip    not available                                        UID=911  PATH=/tmp/NotInsideAVenv/lib/bin
 -  lib_pip     not available                                        UID=911  PATH=./lib/aarch64-linux-docker/pip/venv/bin
 √  sys_npm     /usr/bin/npm                                         UID=911  PATH=~/.npm/bin
 -  lib_npm     /usr/bin/npm                                         UID=911  PATH=./lib/aarch64-linux-docker/npm/node_modules/.bin:./node_modules/.bin:~/.npm/bin
 √  playwright  /usr/local/bin/playwright                            UID=0    PATH=./lib/aarch64-linux-docker/bin:~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 √  puppeteer   /usr/bin/npx                                         UID=911  PATH=./lib/aarch64-linux-docker/bin

 Code locations:
 √  PACKAGE_DIR           33 files        valid     /app/archivebox                                                             
 √  TEMPLATES_DIR         3 files         valid     /app/archivebox/templates                                                   
 -  CUSTOM_TEMPLATES_DIR  missing         unused    ./user_templates                       
 -  USER_PLUGINS_DIR      missing         unused    ./user_plugins                         
 √  LIB_DIR               0 files         valid     /usr/share/archivebox/lib                                                   

 Data locations:
 √  DATA_DIR              19 files @      valid     /data                                                                       
 √  CONFIG_FILE           380.0 Bytes     valid     ./ArchiveBox.conf                      
 √  SQL_INDEX             676.0 KB        valid     ./index.sqlite3                        
 √  QUEUE_DATABASE        148.0 KB        valid     ./queue.sqlite3                        
 √  ARCHIVE_DIR           19 files        valid     ./archive                              
 √  SOURCES_DIR           28 files        valid     ./sources                              
 √  PERSONAS_DIR          1 files         valid     ./personas                             
 √  LOGS_DIR              5 files         valid     ./logs                                 
 √  TMP_DIR               4 files         valid     /tmp/archivebox                                                             

Originally created by @nguyenmp on GitHub (Oct 21, 2024). Original GitHub issue: https://github.com/ArchiveBox/ArchiveBox/issues/1561 #### Describe the bug When I visit the admin snapshot page, archivebox returns Server Error 500. I think there's a small typo introduced in https://github.com/ArchiveBox/ArchiveBox/commit/f75ae805f82c50c3ba0d49c8a62b15e43cb40c10#diff-29838f94de5345a15537facb159a30f5f80a2921c394443fa0ea7ade24102779R85 where `JSONField` should be from `models` rather than `forms` or something like that. Maybe `from django.db.models import JSONField`? I tried massaging the code a bit but didn't get anywhere. #### Steps to reproduce For example: 1. Log in as admin 2. Make a snapshot and click the snapshot timestamp to go to the admin page #### Screenshots or log output ``` django.request Internal Server Error: /admin/core/snapshot/6cb793e5-3d34-4350-b58e-56a1c4aeff4a/change/ Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 518, in thread_handler raise exc_info[1] File "/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py", line 42, in inner response = await get_response(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 518, in thread_handler raise exc_info[1] File "/usr/local/lib/python3.11/site-packages/django/core/handlers/base.py", line 253, in _get_response_async response = await wrapped_callback( ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 468, in __call__ ret = await asyncio.shield(exec_coro) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/asgiref/current_thread_executor.py", line 40, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/asgiref/sync.py", line 522, in thread_handler return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 718, in wrapper return self.admin_site.admin_view(view)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 188, in _view_wrapper result = _process_exception(request, e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 186, in _view_wrapper response = view_func(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/views/decorators/cache.py", line 80, in _view_wrapper response = view_func(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/sites.py", line 241, in inner return view(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/archivebox/abid_utils/admin.py", line 126, in change_view return super().change_view(request, object_id, form_url, extra_context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django_object_actions/utils.py", line 60, in change_view return super(BaseDjangoObjectActions, self).change_view( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1964, in change_view return self.changeform_view(request, object_id, form_url, extra_context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 48, in _wrapper return bound_method(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 188, in _view_wrapper result = _process_exception(request, e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/utils/decorators.py", line 186, in _view_wrapper response = view_func(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1820, in changeform_view return self._changeform_view(request, object_id, form_url, extra_context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1893, in _changeform_view formsets, inline_instances = self._create_formsets( ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 2332, in _create_formsets for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args): File "/usr/local/lib/python3.11/site-packages/django/contrib/admin/options.py", line 937, in get_formsets_with_inlines yield inline.get_formset(request, obj), inline ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/archivebox/core/admin_archiveresults.py", line 86, in get_formset formset.form.base_fields['cmd'] = forms.JSONField(initial=['-']) ^^^^^^^^^^^^^^^ AttributeError: module 'django.forms.forms' has no attribute 'JSONField' ``` #### ArchiveBox version ``` ArchiveBox v0.8.5rc50 COMMIT_HASH=2227d22 BUILD_TIME=2024-10-21 17:04:25 1729530265 IN_DOCKER=True IN_QEMU=False ARCH=aarch64 OS=Linux PLATFORM=Linux-6.10.4-linuxkit-aarch64-with-glibc2.36 PYTHON=Cpython EUID=911:0 UID=911:0 PUID=911:0 FS_UID=911:0 FS_PERMS=644 FS_ATOMIC=True FS_REMOTE=True DEBUG=False IS_TTY=True SUDO=False ID=f16edbfc:ca598960 SEARCH_BACKEND=sonic LDAP=False Binary Dependencies: √ python 3.11.10 sys_pip /usr/local/bin/python3.11 √ django 5.1.2 sys_pip /usr/local/lib/python3.11/site-packages/django/__init__.py √ sqlite 2.6.0 sys_pip /usr/local/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py √ pip 24.0.0 sys_pip /usr/local/bin/pip √ pipx 1.1.0 sys_pip /usr/bin/pipx √ node 22.10.0 apt /usr/bin/node √ npm 10.9.0 apt /usr/bin/npm √ npx 10.9.0 apt /usr/bin/npx √ playwright 1.48.0 sys_pip /usr/local/bin/playwright √ puppeteer 23.6.0 lib_npm ~/.npm/bin/puppeteer √ ldap 3.4.4 sys_pip /usr/local/lib/python3.11/site-packages/ldap/__init__.py √ rg 13.0.0 apt /usr/bin/rg √ sonic 1.4.9 env /usr/local/bin/sonic √ chrome 130.0.6723 env /usr/bin/chromium-browser √ curl 8.10.1 apt /usr/bin/curl √ git 2.39.5 apt /usr/bin/git √ postlight-parser 2.2.3 sys_npm ~/.npm/bin/postlight-parser √ readability-extractor 0.0.11 lib_npm ~/.npm/bin/readability-extractor √ single-file 1.1.54 lib_npm ~/.npm/bin/single-file √ wget 1.21.3 apt /usr/bin/wget √ yt-dlp 2024.10.7 sys_pip /usr/local/bin/yt-dlp √ ffmpeg 5.1.6 env /usr/bin/ffmpeg Package Managers: √ env /usr/bin/which UID=911 PATH=~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin √ apt /usr/bin/apt-get UID=0 PATH=/usr/bin:/bin - brew not available UID=911 PATH= √ sys_pip /usr/local/bin/pip UID=911 PATH=/usr/bin:~/.local/bin:/usr/local/bin - venv_pip not available UID=911 PATH=/tmp/NotInsideAVenv/lib/bin - lib_pip not available UID=911 PATH=./lib/aarch64-linux-docker/pip/venv/bin √ sys_npm /usr/bin/npm UID=911 PATH=~/.npm/bin - lib_npm /usr/bin/npm UID=911 PATH=./lib/aarch64-linux-docker/npm/node_modules/.bin:./node_modules/.bin:~/.npm/bin √ playwright /usr/local/bin/playwright UID=0 PATH=./lib/aarch64-linux-docker/bin:~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin √ puppeteer /usr/bin/npx UID=911 PATH=./lib/aarch64-linux-docker/bin Code locations: √ PACKAGE_DIR 33 files valid /app/archivebox √ TEMPLATES_DIR 3 files valid /app/archivebox/templates - CUSTOM_TEMPLATES_DIR missing unused ./user_templates - USER_PLUGINS_DIR missing unused ./user_plugins √ LIB_DIR 0 files valid /usr/share/archivebox/lib Data locations: √ DATA_DIR 19 files @ valid /data √ CONFIG_FILE 380.0 Bytes valid ./ArchiveBox.conf √ SQL_INDEX 676.0 KB valid ./index.sqlite3 √ QUEUE_DATABASE 148.0 KB valid ./queue.sqlite3 √ ARCHIVE_DIR 19 files valid ./archive √ SOURCES_DIR 28 files valid ./sources √ PERSONAS_DIR 1 files valid ./personas √ LOGS_DIR 5 files valid ./logs √ TMP_DIR 4 files valid /tmp/archivebox ```
Author
Owner

@pirate commented on GitHub (Oct 21, 2024):

Thanks for reporting, this should be easy to fix.

I'll fix the typo/import in the next v0.8.5rc.

<!-- gh-comment-id:2427860208 --> @pirate commented on GitHub (Oct 21, 2024): Thanks for reporting, this should be easy to fix. I'll fix the typo/import in the next v0.8.5rc.
Author
Owner

@pirate commented on GitHub (Jan 8, 2026):

fixed on dev

<!-- gh-comment-id:3722321321 --> @pirate commented on GitHub (Jan 8, 2026): fixed on `dev`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/ArchiveBox#930
No description provided.