Custom Script: __str__ returned non-string (type StringVar)

98 views
Skip to first unread message

Marian Hähnlein

unread,
Feb 18, 2021, 12:53:00 PM2/18/21
to NetBox
Hi!

If i have StringVars in my Custom Scripts I get an error with NetBox 2.10.4. I just wanna ask if there is an issue on my side before I open an issue.

Environment:


Request Method: GET

Django Version: 3.1.3
Python Version: 3.8.7
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'cacheops',
 'corsheaders',
 'debug_toolbar',
 'django_filters',
 'django_tables2',
 'django_prometheus',
 'mptt',
 'rest_framework',
 'taggit',
 'timezone_field',
 'circuits',
 'dcim',
 'ipam',
 'extras',
 'secrets',
 'tenancy',
 'users',
 'utilities',
 'virtualization',
 'django_rq',
 'drf_yasg']
Installed Middleware:
['debug_toolbar.middleware.DebugToolbarMiddleware',
 'django_prometheus.middleware.PrometheusBeforeMiddleware',
 'corsheaders.middleware.CorsMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'netbox.middleware.ExceptionHandlingMiddleware',
 'netbox.middleware.RemoteUserMiddleware',
 'netbox.middleware.LoginRequiredMiddleware',
 'netbox.middleware.APIVersionMiddleware',
 'netbox.middleware.ObjectChangeMiddleware',
 'django_prometheus.middleware.PrometheusAfterMiddleware']


Template error:
In template /opt/netbox/netbox/templates/base.html, error at line 20
   __str__ returned non-string (type StringVar)
   10 :     <link rel="stylesheet"
   11 :           href="{% static 'materialdesignicons-5.4.55/css/materialdesignicons.min.css' %}"
   12 :           onerror="window.location='{% url 'media_failure' %}?filename=materialdesignicons-5.4.55/css/materialdesignicons.min.css'">
   13 :     <link rel="stylesheet"
   14 :           href="{% static 'jquery-ui-1.12.1/jquery-ui.css' %}"
   15 :           onerror="window.location='{% url 'media_failure' %}?filename=jquery-ui-1.12.1/jquery-ui.css'">
   16 :     <link rel="stylesheet"
   17 :           href="{% static 'select2-4.0.13/dist/css/select2.min.css' %}"
   18 :           onerror="window.location='{% url 'media_failure' %}?filename=select2-4.0.13/dist/css/select2.min.css'">
   19 :     <link rel="stylesheet"
   20 :           href="{% static 'select2-bootstrap-0.1.0-beta.10/select2-bootstrap .min.css' %} "
   21 :           onerror="window.location='{% url 'media_failure' %}?filename=select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css'">
   22 :     <link rel="stylesheet"
   23 :           href="{% static 'flatpickr-4.6.3/themes/light.css' %}"
   24 :           onerror="window.location='{% url 'media_failure' %}?filename=flatpickr-4.6.3/themes/light.css'">
   25 :     <link rel="stylesheet"
   26 :           href="{% static 'css/base.css' %}?v{{ settings.VERSION }}"
   27 :           onerror="window.location='{% url 'media_failure' %}?filename=css/base.css'">
   28 :     <link rel="icon" type="image/png" href="{% static 'img/netbox.ico' %}" />
   29 :     <meta charset="UTF-8">
   30 :     <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">


Traceback (most recent call last):
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/opt/netbox/netbox/utilities/views.py", line 45, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/opt/netbox/netbox/extras/views.py", line 431, in get
    return render(request, 'extras/script_list.html', {
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/test/utils.py", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/test/utils.py", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 994, in render
    return render_value_in_context(output, context)
  File "/opt/netbox/venv/lib/python3.8/site-packages/django/template/base.py", line 973, in render_value_in_context
    value = str(value)

Exception Type: TypeError at /extras/scripts/
Exception Value: __str__ returned non-string (type StringVar)


Brian Candler

unread,
Feb 18, 2021, 1:36:52 PM2/18/21
to NetBox
Do you have a minimum reproducing custom script for this?

Brian Candler

unread,
Feb 18, 2021, 1:41:31 PM2/18/21
to NetBox
This script works for me on Netbox 2.10.4:
... and it includes a number of StringVar fields.

Brian Candler

unread,
Feb 19, 2021, 2:57:23 AM2/19/21
to NetBox
On Thursday, 18 February 2021 at 17:53:00 UTC marian.h...@ntsretail.com wrote:
   20 :           href="{% static 'select2-bootstrap-0.1.0-beta.10/select2-bootstrap .min.css' %}
                                                                                    ^  

Also, do you really have an extra space between "bootstrap" and ".min.css"?  Did you edit this template?  In git that line is:

If you checked out from git, use "git status" and "git diff" to check what files you might have edited.

Marian Hähnlein

unread,
Feb 19, 2021, 3:19:33 AM2/19/21
to NetBox
This is the Script I'm getting the error with:

from django.utils.text import slugify

from extras.scripts import *

class MyTestScript(Script):

    class Meta:
        name = "Test the StringVar"
        description = "Throws an error"

    name = StringVar(
        description="Name of the StringVar",
        default="",
        label="A Label"
    )

    def run(self, data, commit):
        self.log_success("Done.")

Marian Hähnlein

unread,
Feb 19, 2021, 3:25:20 AM2/19/21
to NetBox
The space on line 20 is only there on the copy-paste view, I'm using the official docker images (netboxcommunity/netbox:v2.10.4-ldap).

Interestingly, your script works for me.

Marian Hähnlein

unread,
Feb 19, 2021, 3:28:44 AM2/19/21
to NetBox
The StringVar is called `name`. Renaming it to `vm_name` fixed it.
Reply all
Reply to author
Forward
0 new messages