3
votes

I have a problem with my model in the line of 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)

I tried putting the code self.slug = slugify("test of slug") and still the problem , but when he says keeps the information without problems

this is my Error:

Environment:

Request Method: POST Request URL: http://xxx.xx.xx.xx:8000/admin/pages/pages/add/

Django Version: 1.7.1 Python Version: 3.4.2 Installed Applications: ('django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'seo', 'pages', 'site_options', 'news', 'tags', 'category') Installed Middleware: ('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware')

Traceback: File "C:\cms-rock\vrockw\lib\site-packages\django\core\handlers\base.py" in get_response 111. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\contrib\admin\options.py" in wrapper 584. return self.admin_site.admin_view(view)(*args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\utils\decorators.py" in _wrapped_view 105. response = view_func(request, *args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func 52. response = view_func(request, *args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\contrib\admin\sites.py" in inner 204. return view(request, *args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\contrib\admin\options.py" in add_view 1454. return self.changeform_view(request, None, form_url, extra_context) File "C:\cms-rock\vrockw\lib\site-packages\django\utils\decorators.py" in _wrapper 29. return bound_func(*args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\utils\decorators.py" in _wrapped_view 105. response = view_func(request, *args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\utils\decorators.py" in bound_func 25. return func.get(self, type(self))(*args2, **kwargs2) File "C:\cms-rock\vrockw\lib\site-packages\django\db\transaction.py" in inner 394. return func(*args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\contrib\admin\options.py" in changeform_view 1405. self.save_model(request, new_object, form, not add) File "C:\cms-rock\cms\pages\admin.py" in save_model 45. obj.save() File "C:\cms-rock\cms\pages\models.py" in save 37. super(Pages, self).save( *args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\db\models\base.py" in save 591. force_update=force_update, update_fields=update_fields) File "C:\cms-rock\vrockw\lib\site-packages\django\db\models\base.py" in save_base 619. updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) File "C:\cms-rock\vrockw\lib\site-packages\django\db\models\base.py" in _save_table 700. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) File "C:\cms-rock\vrockw\lib\site-packages\django\db\models\base.py" in _do_insert 733. using=using, raw=raw) File "C:\cms-rock\vrockw\lib\site-packages\django\db\models\manager.py" in manager_method 92. return getattr(self.get_queryset(), name)(*args, **kwargs) File "C:\cms-rock\vrockw\lib\site-packages\django\db\models\query.py" in _insert 921. return query.get_compiler(using=using).execute_sql(return_id) File "C:\cms-rock\vrockw\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 920. cursor.execute(sql, params) File "C:\cms-rock\vrockw\lib\site-packages\django\db\backends\utils.py" in execute 85. sql = self.db.ops.last_executed_query(self.cursor, sql, params) File "C:\cms-rock\vrockw\lib\site-packages\mysql\connector\django\base.py" in last_executed_query 371. return cursor.statement File "C:\cms-rock\vrockw\lib\site-packages\mysql\connector\django\base.py" in getattr 147. return getattr(self.cursor, attr) File "C:\cms-rock\vrockw\lib\site-packages\mysql\connector\cursor.py" in statement 858. return self._executed.strip()

Exception Type: AttributeError at /admin/pages/pages/add/ Exception Value: 'NoneType' object has no attribute 'strip'

4
This means self.title is None (of type NoneType). Are you sure it has data in it?Andrew Dunai
Have a data, if use "self.slug = self.title" works fineMiguel Migeru
Pretty sure it's a bug in mysql\connector\cursor.py, bugs.mysql.com/bug.php?id=74675amoeba

4 Answers

1
votes

Try to use slugify function from django.utils.text instead of django.template.defaultfilters. Slugify from django.template.defaultfilters is template filter and it should use in template.

1
votes

Well, I had the same problem. This is how I fixed.

slugify(self.title).__str__()

Slugify returns a "SafeString" and it does not have any "strip()" function. So I get a "str" and it works.

0
votes

This error means that title property of the created model doesn't have a value, you need to make sure that your Page instance has the required attribute before you slugify its title.

the following code is a good workaround, but you still need to know why your model doesn't have a title when it is being saved.

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

An optimal solution for you is to use Django Autoslug library which will save you from all the hassle of setting a value for your slug field.

check it out:

from autoslug import AutoSlugField

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

You can use django signals to solve this issue. Try adding the following code at the end of your 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)