簡體   English   中英

注冊 - 序列項 0:預期的 str 實例,找到 NoneType

[英]Registration - sequence item 0: expected str instance, NoneType found

Django 版本:3.0.8 - Python 版本:3.7.8

我最近在我的 Django 站點上發現了一個錯誤。 當用戶想要創建一個帳戶時,它會返回此錯誤:序列項 0:預期的 str 實例,已找到 NoneType

手術:

  • 帳戶創建(檢查數據庫中是否不存在用戶名)
  • 創建用戶 Active = 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

模型.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)

讓我簡化你看到的錯誤:

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_addressNone

同時,我認為您不需要在那里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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM