views:

212

answers:

2

Hi guy, i dont know where is my error, but Django 1.2.1 is give this error: 'NoneType' object has no attribute 'day' when i try to save form from the Administrator Area

models.py

from django.db import models
from django.contrib.auth.models import User


class Editorial(models.Model):

    titulo = models.CharField(max_length=250,help_text='Titulo del editorial')
    editorial = models.TextField(help_text='Editorial')
    slug = models.SlugField(unique_for_date='pub_date')
    autor = models.ForeignKey(User)
    pub_date = models.DateTimeField(auto_now_add=True)
    activa = models.BooleanField(verbose_name="Activa")
    enable_comments = models.BooleanField(verbose_name="Aceptar Comentarios",default=False)

    editorial_html = models.TextField(editable=False,blank=True)

    def __unicode__(self):
        return unicode(self.titulo)

    def get_absolute_url(self):
        return "/editorial/%s/%s/" % (self.pub_date.strftime("%Y/%b/%d").lower(), self.slug)

    class Meta:
        ordering=['-pub_date']   
        verbose_name_plural ='Editoriales'

    def save(self,force_insert=False, force_update=False):
        from markdown import markdown
        if self.editorial:
            self.editorial_html = markdown(self.editorial)
        super(Editorial,self).save(force_insert,force_update)

i dont know why this error,

COMPLETED ERROR:

    Traceback:
File "C:\wamp\bin\Python26\lib\site-packages\django\core\handlers\base.py" in get_response
  100.                     response = callback(request, *callback_args, **callback_kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\contrib\admin\options.py" in wrapper
  239.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  76.                     response = view_func(request, *args, **kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
  69.         response = view_func(request, *args, **kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\contrib\admin\sites.py" in inner
  190.             return view(request, *args, **kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\utils\decorators.py" in _wrapper
  21.             return decorator(bound_func)(*args, **kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  76.                     response = view_func(request, *args, **kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\utils\decorators.py" in bound_func
  17.                 return func(self, *args2, **kwargs2)
File "C:\wamp\bin\Python26\lib\site-packages\django\db\transaction.py" in _commit_on_success
  299.                     res = func(*args, **kw)
File "C:\wamp\bin\Python26\lib\site-packages\django\contrib\admin\options.py" in add_view
  777.             if form.is_valid():
File "C:\wamp\bin\Python26\lib\site-packages\django\forms\forms.py" in is_valid
  121.         return self.is_bound and not bool(self.errors)
File "C:\wamp\bin\Python26\lib\site-packages\django\forms\forms.py" in _get_errors
  112.             self.full_clean()
File "C:\wamp\bin\Python26\lib\site-packages\django\forms\forms.py" in full_clean
  269.         self._post_clean()
File "C:\wamp\bin\Python26\lib\site-packages\django\forms\models.py" in _post_clean
  345.             self.validate_unique()
File "C:\wamp\bin\Python26\lib\site-packages\django\forms\models.py" in validate_unique
  354.             self.instance.validate_unique(exclude=exclude)
File "C:\wamp\bin\Python26\lib\site-packages\django\db\models\base.py" in validate_unique
  695.         date_errors = self._perform_date_checks(date_checks)
File "C:\wamp\bin\Python26\lib\site-packages\django\db\models\base.py" in _perform_date_checks
  802.                 lookup_kwargs['%s__day' % unique_for] = date.day

Exception Type: AttributeError at /admin/editoriales/editorial/add/
Exception Value: 'NoneType' object has no attribute 'day'

UPDATE MODEL ADMIN:

from django.contrib import admin
from myproject.editoriales.models import Editorial

    class EditorialAdmin(admin.ModelAdmin):
        prepopulated_fields = {'slug': ['titulo']}
        list_display = ('titulo', 'pub_date', 'autor', 'activa')
        list_per_page = 10
        date_hierarchy = 'pub_date'
        search_fields = ['titulo', 'editorial', ]
        list_filter = ('pub_date', 'activa', 'autor',)

        class Media:
            js = ('/public/tiny_mce/tiny_mce.js',             
                  '/public/tiny_mce/textareas.js',             
                  )

    admin.site.register(Editorial, EditorialAdmin)

thanks guys

sorry with my English

A: 

Trying replacing:

def save(self,force_insert=False, force_update=False):
    from markdown import markdown
    if self.editorial:
        self.editorial_html = markdown(self.editorial)
    super(Editorial,self).save(force_insert,force_update)

with:

def save(self, *args, **kwargs):
    from markdown import markdown
    if self.editorial:
        self.editorial_html = markdown(self.editorial)
    super(Editorial,self).save(*args, **kwargs)

Note the difference in the last line. You were calling the save function with two positional arguments with False values (they probably should have been keyword arguments in which case it would look like super(Editorial,self).save(force_insert=force_insert,force_update=force_update)) , as well as limiting the possible options that can be passed to Django's save method which you're overriding. The second code snippet above solves both problems.

John Debs
Thanks John Debs for your help, but i have the same error :(
Asinox
+2  A: 

I think the problem is having unique_for_date='pub_date' together with pub_date that is auto_now_add=True. auto_now_add works only after the save has been done. unique_for_date is checked before the save. when the checking is done, the pub_date field is still None, and so the check fails.

proposed solutions:

  1. change slug from unique_for_date to unique (but then you can't have 2 articles with same slug on different dates).
  2. change the pub_date from auto_now_add to default=datetime.date.today (but then users can change that value manually).
  3. same as 2, but also use editable=False.
Ofri Raviv
thanks Ofri Raviv, is working, and i learn something new :)
Asinox