注册序列项0:应为str实例,未找到非类型

2024-06-26 04:06:01 发布

您现在位置:Python中文网/ 问答频道 /正文

Django版本:3.0.8-Python版本:3.7.8

我最近在Django网站上发现了一个错误。当用户想要创建帐户时,会返回以下错误: 序列项0:应为str实例,未找到NoneType

操作:

  • 帐户创建(检查数据库中是否不存在用户名)
  • 创建用户活动=False
  • 发送确认帐户创建的电子邮件

第一步出现错误,创建帐户(Active=False),不发送电子邮件,并显示错误

Traceback (most recent call last):
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/eodj89/DjangoPro/user/views.py", line 45, in signup
    user.save()
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 66, in save
    super().save(*args, **kwargs)
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/db/models/base.py", line 746, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/db/models/base.py", line 795, in save_base
    update_fields=update_fields, raw=raw, using=using,
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/dispatch/dispatcher.py", line 175, in send
    for receiver in self._live_receivers(sender)
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/dispatch/dispatcher.py", line 175, in <listcomp>
    for receiver in self._live_receivers(sender)
  File "/home/eodj89/DjangoPro/user/models.py", line 479, in create_user_profile
    UserProfile.objects.create(user=instance)
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/eodj89/virtualenv/DjangoPro/3.7/lib/python3.7/site-packages/django/db/models/query.py", line 433, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/eodj89/DjangoPro/user/models.py", line 346, in save
    address = " ".join([self.full_address])

Exception Type: TypeError at /account/register/
Exception Value: sequence item 0: expected str instance, NoneType found

models.py

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    full_address = models.CharField(null=True,blank=True,max_length=128)
    latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
    longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
    slug = models.SlugField(editable=False)

    def save(self, *args,**kwargs):
        self.slug = slugify(self.user.username)
        
        address = " ".join([self.full_address])
        result = geocoder.geocode(address)

        if result and len(result):
            self.longitude = result[0]['geometry']['lng']
            self.latitude  = result[0]['geometry']['lat']
        
        super(Profile, self).save(*args, **kwargs)

Tags: djangoinpyselfhomevirtualenvmodelslib
1条回答
网友
1楼 · 发布于 2024-06-26 04:06:01

让我简化您看到的错误:

In [1]: ''.join([None])
                                     -
TypeError                                 Traceback (most recent call last)
<ipython-input-1-29122f69a077> in <module>
  > 1 ''.join([None])

TypeError: sequence item 0: expected str instance, NoneType found

在您的情况下,此行会出现相同的异常:

address = " ".join([self.full_address])

这意味着self.full_address就是None

同时,我认为您不需要join,因为您尝试连接单个字符串。你对这一行的期望是什么

因此,模型的代码如下所示:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    full_address = models.CharField(null=True,blank=True,max_length=128)
    latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
    longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
    slug = models.SlugField(editable=False)

    def save(self, *args,**kwargs):
        self.slug = slugify(self.user.username)
        
        if self.full_address:
            geo_code = geocoder.geocode(self.full_address)

            if geo_code:
                self.longitude = geo_code[0]['geometry']['lng']
                self.latitude  = geo_code[0]['geometry']['lat']
            
        super(Profile, self).save(*args, **kwargs)

相关问题 更多 >