首页 > 解决方案 > 异常值:__str__ 在 django 模型中返回非字符串(int 类型)

问题描述

我想创建一个函数,该函数返回在过去 48 小时内发送导航数据的每辆车的最后点列表。我创建了一个可以正常工作的视图,并且可以正确显示名称,但是当我想VehicleDjango 管理面板添加新视图时,它会显示错误。

/admin/navigation/navigationrecord/add/ str处的 TypeError返回非字符串(int 类型)

我该如何解决?是否有更有效和更有效的方式来列出过去 48 小时内的数据?

模型.py

class Vehicle(models.Model):

    id = models.IntegerField(primary_key=True)
    plate = models.CharField(max_length=30)

    def __str__(self):
        return str(self.plate)


class NavigationRecord(models.Model):
    id = models.IntegerField(primary_key=True)
    vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE)
    datetime = models.DateField(default=timezone.now)
    latitude = models.FloatField()
    longitude = models.FloatField()

    def __str__(self):
        return self.vehicle

视图.py

def get_48_hours(request):

    time_48 = datetime.now() - timedelta(hours=48)
    results = NavigationRecord.objects.filter(datetime__gte=time_48)
    context = {

            'results': results,
    }
    return render(request, 'navigation.html', context)

导航.html

 <table class="table table-hover">
        <thead>
          <tr>
            <th>ID</th>
            <th>Vehicle</th>
          </tr>
        </thead>
        <tbody>
        {% for result in results %}
          <tr>
            <td>{{result.id}}</td>
            <td>{{result.vehicle}}</td>
            <td>{{result.datetime}}</td>

          </tr>
        {% endfor %}
        </tbody>
    </table>

管理员.py

models = [Vehicle, NavigationRecord]
admin.site.register(models)

追溯

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/admin/navigation/navigationrecord/add/

Django Version: 2.2.13
Python Version: 3.7.0
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'navigation']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 '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']


Template error:
In template C:\Users\edeni\senior\myenv\lib\site-packages\django\contrib\admin\templates\admin\includes\fieldset.html, error at line 19
   __str__ returned non-string (type int)
   9 :             {% for field in line %}
   10 :                 <div{% if not line.fields|length_is:'1' %} class="fieldBox{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
   11 :                     {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
   12 :                     {% if field.is_checkbox %}
   13 :                         {{ field.field }}{{ field.label_tag }}
   14 :                     {% else %}
   15 :                         {{ field.label_tag }}
   16 :                         {% if field.is_readonly %}
   17 :                             <div class="readonly">{{ field.contents }}</div>
   18 :                         {% else %}
   19 :                              {{ field.field }} 
   20 :                         {% endif %}
   21 :                     {% endif %}
   22 :                     {% if field.field.help_text %}
   23 :                         <div class="help">{{ field.field.help_text|safe }}</div>
   24 :                     {% endif %}
   25 :                 </div>
   26 :             {% endfor %}
   27 :         </div>
   28 :     {% endfor %}
   29 : </fieldset>


Traceback:

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\core\handlers\base.py" in _get_response
  145.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\core\handlers\base.py" in _get_response
  143.                 response = response.render()

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\response.py" in render
  106.             self.content = self.rendered_content

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\response.py" in rendered_content
  83.         content = template.render(context, self._request)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\backends\django.py" in render
  61.             return self.template.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  171.                     return self._render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\loader_tags.py" in render
  150.             return compiled_parent._render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\loader_tags.py" in render
  150.             return compiled_parent._render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\loader_tags.py" in render
  62.                 result = block.nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\loader_tags.py" in render
  62.                 result = block.nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\defaulttags.py" in render
  209.                     nodelist.append(node.render_annotated(context))

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\loader_tags.py" in render
  188.             return template.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  173.                 return self._render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\defaulttags.py" in render
  209.                     nodelist.append(node.render_annotated(context))

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\defaulttags.py" in render
  209.                     nodelist.append(node.render_annotated(context))

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\defaulttags.py" in render
  309.                 return nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\defaulttags.py" in render
  309.                 return nodelist.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render
  993.         return render_value_in_context(output, context)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\template\base.py" in render_value_in_context
  972.             value = str(value)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\utils\html.py" in <lambda>
  388.     klass.__str__ = lambda self: mark_safe(klass_str(self))

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\boundfield.py" in __str__
  33.         return self.as_widget()

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\boundfield.py" in as_widget
  93.             renderer=self.form.renderer,

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\widgets.py" in render
  241.         context = self.get_context(name, value, attrs)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\contrib\admin\widgets.py" in get_context
  288.             'rendered_widget': self.widget.render(name, value, attrs),

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\widgets.py" in render
  241.         context = self.get_context(name, value, attrs)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\widgets.py" in get_context
  678.         context = super().get_context(name, value, attrs)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\widgets.py" in get_context
  639.         context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\widgets.py" in optgroups
  587.         for index, (option_value, option_label) in enumerate(self.choices):

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\models.py" in __iter__
  1138.             yield self.choice(obj)

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\models.py" in choice
  1150.         return (self.field.prepare_value(obj), self.field.label_from_instance(obj))

File "C:\Users\edeni\senior\myenv\lib\site-packages\django\forms\models.py" in label_from_instance
  1216.         return str(obj)

Exception Type: TypeError at /admin/navigation/navigationrecord/add/
Exception Value: __str__ returned non-string (type int)

标签: pythondjangodjango-models

解决方案


如果您查看 stracktrace,它的字面意思是:__str__ returned non-string (type int). 这是由您NavigationRecord的 '__str__方法引起的,该方法返回self.vehicle的是外键,因此是整数。尝试更改此方法以返回 str self.vehicle__str__那应该叫Vehicle上课。

    def __str__(self):
        return str(self.vehicle)

推荐阅读