'NoneType'对象没有属性'strip' - Slugify

时间:2014-12-04 18:59:31

标签: python django

我的模型在slugify中存在问题

from django.db import models
from django.contrib.auth.models import User
from django.template.defaultfilters import slugify

# Create your models here.
class Pages(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(blank=True)
    content =  models.TextField(blank=True)
    publish_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)
    order =  models.IntegerField(default=0)
    type_content = models.CharField(max_length=255)
    user = models.ForeignKey(User)  
    status =models.IntegerField(default=1)

    def __str__(self):
        return self.title   


    def save(self,  *args, **kwargs):

        if not self.slug:
            self.slug = slugify(self.title)

        #self.user=self.request.user
        super(Pages, self).save( *args, **kwargs)

我尝试将代码self.slug = slugify("测试slug")仍然存在问题,但是当他说保持信息没有问题时

这是我的错误:

  
    

环境:

  
     

请求方法:POST请求URL:   http://xxx.xx.xx.xx:8000/admin/pages/pages/add/

     

Django版本:1.7.1 Python版本:3.4.2已安装的应用程序:   (' django.contrib.admin',' django.contrib.auth',   ' django.contrib.contenttypes',' django.contrib.sessions',   ' django.contrib.messages' django.contrib.staticfiles',' seo',   '页面',' site_options','新闻','标签','类别')已安装   中间件:(' django.contrib.sessions.middleware.SessionMiddleware',   ' django.middleware.common.CommonMiddleware&#39 ;,   ' django.middleware.csrf.CsrfViewMiddleware&#39 ;,   ' django.contrib.auth.middleware.AuthenticationMiddleware&#39 ;,   ' django.contrib.auth.middleware.SessionAuthenticationMiddleware&#39 ;,   ' django.contrib.messages.middleware.MessageMiddleware&#39 ;,   ' django.middleware.clickjacking.XFrameOptionsMiddleware&#39)

     

回溯:文件   " C:\ CMS-岩石\ vrockw \ lib中\站点包\ django的\芯\处理程序\ base.py"在   get_response     111. response = wrapped_callback(request,* callback_args,** callback_kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ contrib \ admin \ options.py"   在包装中     584. return self.admin_site.admin_view(view)(* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ utils \ decorators.py"在   _wrapped_view     105. response = view_func(request,* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ views \ decorators \ cache.py"   在_wrapped_view_func中     52. response = view_func(request,* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ contrib \ admin \ sites.py"   在内心     204. return view(request,* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ contrib \ admin \ options.py"   在add_view中     1454. return self.changeform_view(request,None,form_url,extra_context)File   " C:\ CMS-岩石\ vrockw \ lib中\站点包\ django的\ utils的\ decorators.py"在   _wrapper     29. return bound_func(* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ utils \ decorators.py"在   _wrapped_view     105. response = view_func(request,* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ utils \ decorators.py"在   bound_func     25. return func。 get (self,type(self))(* args2,** kwargs2)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \分贝\ transaction.py"在   内     394. return func(* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ contrib \ admin \ options.py"   在changeform_view中     1405. self.save_model(request,new_object,form,not add)File" C:\ cms-rock \ cms \ pages \ admin.py"在save_model中     45. obj.save()文件" C:\ cms-rock \ cms \ pages \ models.py"在保存     37. super(Pages,self).save(* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ db \ models \ base.py"在   保存     591. force_update = force_update,update_fields = update_fields)文件   " C:\ CMS岩\ vrockw \ LIB \站点包\ Django的\ DB \型号\ base.py"在   save_base     619. updated = self._save_table(raw,cls,force_insert,force_update,using,update_fields)文件   " C:\ CMS岩\ vrockw \ LIB \站点包\ Django的\ DB \型号\ base.py"在   _save_table     700. result = self._do_insert(cls._base_manager,using,fields,update_pk,raw)文件   " C:\ CMS岩\ vrockw \ LIB \站点包\ Django的\ DB \型号\ base.py"在   _do_insert     733. using = using,raw = raw)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ db \ models \ manager.py"在   manager_method     92. return getattr(self.get_queryset(),name)(* args,** kwargs)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ db \ models \ query.py& #34;在   _插入     921. return query.get_compiler(using = using).execute_sql(return_id)File   " C:\ CMS岩\ vrockw \ LIB \站点包\ Django的\ DB \型号\ SQL \ compiler.py"   在execute_sql中     920. cursor.execute(sql,params)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ django \ db \ backends \ utils.py"在   执行     85. sql = self.db.ops.last_executed_query(self.cursor,sql,params)文件   " C:\ CMS-岩石\ vrockw \ lib中\站点包\ MySQL的\连接器\ django的\ base.py"   在last_executed_query中     371. return cursor.statement File" C:\ cms-rock \ vrockw \ lib \ site-packages \ mysql \ connector \ django \ base.py"   在 getattr     147. return getattr(self.cursor,attr)File" C:\ cms-rock \ vrockw \ lib \ site-packages \ mysql \ connector \ cursor.py"在   声明     858. return self._executed.strip()

     

异常类型:/ admin / pages / pages / add / Exception中的AttributeError   价值:' NoneType'对象没有属性' strip'

4 个答案:

答案 0 :(得分:1)

尝试使用django.utils.text而不是django.template.defaultfilters的slugify功能。来自django.template.defaultfilters的Slugify是模板过滤器,它应该在模板中使用。

答案 1 :(得分:1)

好吧,我遇到了同样的问题。这是我修复的方式。

slugify(self.title).__str__()

Slugify返回" SafeString"并且它没有任何" strip()"功能。所以我得到了一个" str"它有效。

答案 2 :(得分:0)

此错误表示创建的模型的 title 属性没有值, 您需要确保您的 Page 实例具有必需的属性,然后才能对其标题进行 slugify。

以下代码是一个很好的解决方法,但您仍然需要知道为什么您的模型在保存时没有标题。

...
class Pages(models.Model):
    ...
    def save(self,  *args, **kwargs):
        if self.title and not self.slug:
            self.slug = slugify(self.title)
     ...

最适合您的解决方案是使用 Django Autoslug 库,它可以让您免去为 slug 字段设置值的所有麻烦。

检查一下:

from autoslug import AutoSlugField

class Pages(Model):
    title = CharField(max_length=255)
    slug =  AutoSlugField(populate_from='title')

答案 3 :(得分:0)

您可以使用 django 信号来解决这个问题。尝试在 models.py 的末尾添加以下代码

from django.db.models.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save, sender=Pages)
def pre_save_pages(sender, instance, *args, **kwargs):
    if not instance.u_id:
        instance.slug = slugify(instance.title)