class Varticles(models.Model): name = models.CharField(max_length=250, blank=True, verbose_name=_(u'Name')) desc = RedactorField(blank=True, verbose_name=_(u'Description')) adesc = RedactorField(blank=True, verbose_name=_(u'Description additional')) lesson = models.ForeignKey(Vlesson, verbose_name=_(u'Course'), blank=True, null=True) name_slug = models.CharField(verbose_name='Name slug', max_length=250, blank=True) pub = models.BooleanField(verbose_name=_('Is published?'), default=True) sound = models.FileField(blank=True, verbose_name=_(u'Sound'), upload_to=path_and_rename('vcourse_sound'), null=True) owner = models.ForeignKey(User, verbose_name=_(u'Owner')) is_free = models.BooleanField(verbose_name=_('Is free?'), default=False) def get_absolute_url(self): return reverse("article-detail", kwargs={"id": self.id}) def __unicode__(self): return self.name def save(self, **kwargs): if not self.id: self.name_slug = pytils.translit.slugify(self.name) return super(Varticles, self).save(**kwargs)
class ConferencePage(models.Model): ''' pages contain all the info for a page to be created. ''' title = models.CharField(max_length=120) introduction = models.CharField(max_length=255, null=True, blank=True) body = RedactorField(verbose_name='body', upload_to='page_body') sidebar = RedactorField(verbose_name='sidebar', null=True, blank=True, upload_to='page_sidebar_body') author = models.ForeignKey(User) slug = models.SlugField() date_created = models.DateTimeField(auto_now_add=True) last_updated = models.DateTimeField(auto_now=True) def __unicode__(self): return self.title def __str__(self): return self.title def save(self, *args, **kwargs): # saving the slug everytime from the title self.slug = slugify(self.title) super(ConferencePage, self).save(*args, **kwargs)
class WhatWeDo(TranslatableModel): """ WhatWeDo Model """ translations = TranslatedFields( title=models.CharField(_('title'), help_text=_("to be translated"), max_length=255), short_description=RedactorField(_('short description'), help_text=_("to be translated")), description=RedactorField(_('description'), help_text=_("to be translated")), ) illustration = models.ImageField(_('illustration'), help_text=_("don't translate"), max_length=255, upload_to="whatwedo") tags = TaggableManager(blank=True) position = models.PositiveIntegerField(default=0, blank=False, null=False) class Meta: verbose_name_plural = "WhatWeDo" ordering = ('position', ) def __unicode__(self): # beurk, never use hvad again. next time multilingual-ng ? return self.safe_translation_getter('title', unicode(self.pk))
class MealTheme(models.Model): address = models.CharField('地址:', max_length=100, help_text='限50字', blank=True, null=True) addresslink = models.CharField('Google Map Link:', max_length=200, blank=True, null=True) sitetitle = models.CharField('網站標題(必填):', max_length=100, help_text='限50字') brand = models.CharField('品牌名稱(必填):', max_length=100, help_text='限50字') doptions = zip(range(0, len(css_themes)), css_themes) themecolor = models.IntegerField('網站主題顏色:', default=-1, choices=doptions) title = models.CharField('關於我們標題(必填):', max_length=100, help_text='限50字') desc = RedactorField(verbose_name='關於我們的故事(必填):', redactor_options={'focus': 'true'}, allow_file_upload=False, allow_image_upload=False) deliverydesc = RedactorField(verbose_name='送餐說明(必填):', redactor_options={'focus': 'true'}, allow_file_upload=False, allow_image_upload=False) taxrate = models.FloatField('稅率', default=0.0) deliveryfee = models.DecimalField('送餐費(CDN$)', max_digits=5, decimal_places=2) name = models.CharField('暱稱(必填):', max_length=100, help_text='限50字') wechat = models.CharField('微信帳號(必填):', max_length=100, help_text='限50字') wechatqr = models.ImageField(verbose_name='微信QR碼圖片(必填)', upload_to=rename_wechatID) facebook = models.CharField('臉書帳號(選填):', max_length=100, help_text='限50字', blank=True, null=True) twitter = models.CharField('推特帳號(選填):', max_length=100, help_text='限50字', blank=True, null=True) weibo = models.CharField('新浪微博(選填):', max_length=100, help_text='限50字', blank=True, null=True) tel = models.CharField('電話(必填):', max_length=100, help_text='限50字') email = models.CharField('電子郵件(必填):', max_length=100, help_text='限50字') pub_time = models.DateTimeField('發布時間', auto_now_add=True) update_time = models.DateTimeField('修改時間', auto_now=True) md5sum = models.CharField(max_length=36, editable=False) def __str__(self): return self.title class Meta: ordering = ('-update_time', )
class Linea_de_servicio(models.Model): nombre = models.CharField(max_length=80) imagen = models.ImageField(upload_to='uploads', default='imagen/default.png') imagen_interna = models.ImageField(upload_to='uploads', default='imagen/default.png') texto_lema = RedactorField(verbose_name=u'Lema', default=' ') texto_descripcion = RedactorField(verbose_name=u'Descripcion', default=' ') def __unicode__(self): return self.nombre
class ThreeArticles(Article): preview_part1 = RedactorField(blank=True) preview_part2 = RedactorField(blank=True) preview_part3 = RedactorField(blank=True) def full_url(self): if Match is None: return '' return self.match.full_url('match_before')
class Linea_individual(models.Model): nombre = models.CharField(max_length=100) linea = models.ForeignKey(Linea_de_servicio, blank=True, default='') contenido = RedactorField(verbose_name=u'Descripcion', default=' ') texto_descripcion_en = RedactorField(verbose_name=u'Descripcion Ingles', default=' ', blank=True) texto_descripcion_fr = RedactorField(verbose_name=u'Descripcion Frances', default=' ', blank=True) def __unicode__(self): return self.nombre + u" --- " + self.linea.nombre
class Study(models.Model): creation_date = models.DateTimeField(auto_now=True) requisition = models.ForeignKey(Requisition, verbose_name=u'Requisición', on_delete=models.CASCADE) service = models.ForeignKey(Service, verbose_name=u'Servicio') employee = models.ForeignKey(User, verbose_name=u'Empleado') limit_date = models.DateTimeField(verbose_name=u'Fecha de Entrega') description = RedactorField(verbose_name=u'Descripción') attachment = models.FileField(upload_to=get_path, verbose_name=u'Archivos adjuntos') observations = RedactorField(verbose_name=u'Observaciones', blank=True, null=True) status = models.CharField(max_length=1, default='A', verbose_name=u'Estado', choices=STUDY_STATUS)
class Trabaje_con_nosotros(models.Model): nombre = models.CharField(max_length=80) nombre_en = models.CharField(max_length=80) nombre_fr = models.CharField(max_length=80) contenido = RedactorField(verbose_name=u'Contenido', default=' ') contenido_en = RedactorField(verbose_name=u'Contenido Ingles', default=' ') contenido_fr = RedactorField(verbose_name=u'Contenido Frances', default=' ') def __unicode__(self): return self.nombre
class acerca(models.Model): nombre = models.CharField(max_length=80) texto_descripcion = RedactorField(verbose_name=u'Contenido', default=' ') texto_descripcion_en = RedactorField(verbose_name=u'Contenido Ingles', default=' ') texto_descripcion_fr = RedactorField(verbose_name=u'Contenido Frances', default=' ') imagen_interna = models.ImageField(upload_to='uploads', default='imagen/default.png') def __unicode__(self): return self.nombre
class Product(models.Model): brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True) category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True) title = models.CharField(max_length=120, blank=False, null=False, verbose_name=_('Title')) highlights = RedactorField(null=True, blank=True, verbose_name=_('Highlights')) description = RedactorField(null=True, blank=True, verbose_name=_('Description')) timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) updated = models.DateTimeField(auto_now=True, auto_now_add=False) facebook_plugin = models.BooleanField(default=False, verbose_name=_('facebook message')) price = models.FloatField() importance = models.CharField(max_length=120, choices=LEVEL_CHOICES, blank=True, null=True, verbose_name=_('Importance')) def get_image(self): return self.productimage_set.first() def get_images(self): return self.productimage_set.all() def get_image_urls(self): return [image.image.url for image in self.productimage_set.all()] def fake_price(self): """ :return: price with 20% discount """ return self.price + self.price * 0.20 # def __str__(self): def __unicode__(self): return self.title class Meta: verbose_name = _('Product') verbose_name_plural = _('Products') ordering = ['id']
class Pagina(models.Model): EXTERNO = '__blank' INTERNO = '' TARGET_CHOICES = ( ('1', 'Enlace Interno'), ('2', 'Enlace externo'), ) titulo_pagina = models.CharField(max_length=1000) cuerpo_pagina = RedactorField(verbose_name='Contenido de la página', upload_to='static/uploads_paginas', allow_file_upload = True, allow_image_upload = True) titulo_menu = models.CharField(max_length=255) descripcion = models.TextField() pagina_padre = models.ForeignKey("Pagina", blank=True, null=True, default=None) peso = models.IntegerField(default=0) target = models.CharField(max_length=140, blank=True, null=True, choices=TARGET_CHOICES, default=1) url = models.TextField(default=None, blank=True, null=True) nucleo = models.ForeignKey(Nucleo, blank=True, null=True) usuario = models.ForeignKey(settings.AUTH_USER_MODEL) def __unicode__(self): return self.titulo_pagina
class ContentEntry(models.Model): """ Abstract ContentEntry Model class providing field and methods to write short and full description of the content inside entry; """ content = RedactorField(help_text='Full Description of the Content') class Meta: abstract = True @property def word_count(self): """ :return: total word of the content """ return count_words(self.content) @property def read_time(self): """ :return: read time for cotent in minutes """ return get_read_time(self.content)
class Post(TimeStampedModel): author = models.ForeignKey(Author, related_name='author_post', on_delete=models.CASCADE) title = models.CharField(max_length=200) slug = models.SlugField(max_length=200, unique=True) cover = models.ImageField(upload_to='gallery/covers/%Y/%m/%d', null=True, blank=True, help_text='Optional cover post') description = RedactorField() tags = models.ManyToManyField('Tag') keywords = models.CharField(max_length=200, null=True, blank=True, help_text='Keywords sparate by comma.') meta_description = models.TextField(null=True, blank=True) publish = models.BooleanField(default=True) objects = PostQuerySet.as_manager() def get_absolute_url(self): return reverse('detail_post_page', kwargs={'slug': self.slug}) @property def total_visitors(self): return Visitor.objects.filter(post__pk=self.pk).count() def __str__(self): return self.title class Meta: verbose_name = 'Detail Post' verbose_name_plural = 'Posts' ordering = ["-created"]
class Event(models.Model): """ Event model. """ id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, verbose_name=_("ID")) name = models.CharField(verbose_name=_("name"), max_length=256, db_index=True, unique=True) description = RedactorField(verbose_name=_("description"), blank=True, null=True, db_index=True) group = models.ForeignKey("core.Group", verbose_name=_("group"), db_index=True, related_name="events") address = models.CharField(verbose_name=_("address"), max_length=2048, blank=False, null=True, db_index=True) start = models.DateTimeField(verbose_name=_("start date/time"), blank=False, null=True, db_index=True) created = models.DateTimeField(verbose_name=_("created date/time"), blank=True, null=True, db_index=True, auto_now_add=True) updated = models.DateTimeField(verbose_name=_("start date/time"), blank=True, null=True, db_index=True, auto_now=True) class Meta: unique_together = ["group", "start",] app_label = "core" verbose_name = _("event") verbose_name_plural = _("events") ordering = ["-created", "-start"] def __unicode__(self): return self.name def __str__(self): return self.__unicode__()
class AboutSection(models.Model): title = models.CharField(max_length=50, ) slug = models.CharField( max_length=50, blank=True, ) icon_class = models.CharField( max_length=50, blank=True, null=True, ) order = models.PositiveSmallIntegerField(unique=True, ) content = RedactorField() class Meta: ordering = ['order'] def save(self, *args, **kwargs): self.slug = slugify(self.title.encode('utf-8')) self.content = self.content.replace( "<img src=", "<img class='img-responsive' src=") super(AboutSection, self).save(*args, **kwargs)
class Education(models.Model): class Meta: ordering = '-date'.split() verbose_name = 'статья' verbose_name_plural = 'статьи' choices = (('ПДМО', 'ПДМО'), ('НМО', 'НМО')) category = models.CharField(choices=choices, max_length=100, verbose_name='Категория') name = models.CharField(max_length=100, verbose_name='Заголовок') text = RedactorField( verbose_name='Текст', upload_to=image_upload_to, # redactor_options={'buttons': ['image'],}, allow_image_upload=True, allow_file_upload=True) date = models.DateTimeField(auto_now=True, verbose_name='Дата') file = models.FileField(upload_to=image_upload_to, blank=True, null=True, verbose_name='Файл') def __unicode__(self): return self.name
class Project(TranslatableModel): """ Project Model """ translations = TranslatedFields(title=models.CharField(_('title'), max_length=255), description=RedactorField(_('description'), blank=True, null=True), client=models.CharField(_('client'), max_length=255, blank=True, null=True)) slug = models.SlugField(unique=True) offices = models.ManyToManyField(Office) date = models.DateField(blank=True, null=True) image = ImageWithThumbsField(_("image"), sizes=settings.THUMBNAILS_PROJECTS, upload_to="projects") order = models.PositiveIntegerField(default=0, blank=False, null=False) highlighted = models.BooleanField(_("highlighted")) link = models.CharField(_('link'), max_length=255, blank=True, null=True) tags = TaggableManager(blank=True) class Meta: ordering = ('order', '-date') def __unicode__(self): return self.safe_translation_getter('title', unicode(self.pk)) def get_absolute_url(self): return reverse('jplusplus_project_details', args=[str(self.slug)])
class Banner(models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/banners/%s' % filename.lower() title = models.CharField(max_length=100, verbose_name=u'заголовок') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение', help_text=u'150x150 px размер баннера ') description = RedactorField(max_length=1000, verbose_name=u'описание', blank=True) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) def get_title(self): return self.title def get_image(self): return self.image def get_description(self): return self.description def __unicode__(self): return self.get_title() class Meta: verbose_name = u'баннер' verbose_name_plural = u'баннеры' ordering = ['sort', '-id'] ################################################################################################################ ################################################################################################################
class Gallery(models.Model): class Meta: verbose_name = 'Фото-Отчет' verbose_name_plural = 'Фото-Отчеты' ordering = '-updated'.split() image = models.ImageField(upload_to=image_upload_to, null=True) name = models.CharField(max_length=100, verbose_name='Название') foto_text = RedactorField(upload_to=image_upload_to, allow_file_upload=True, allow_image_upload=True, verbose_name='Фото-Отчет', null=True) updated = models.DateTimeField(blank=True, null=True, auto_now=True) date = models.CharField(blank=True, null=True, max_length=100) def __unicode__(self): return self.name def get_time(self): return date(self.updated, 'Y.m.d - H:i') def get_date(self): return self.date def get_text(self): return '%s...' % self.body[0:50] # return '%s...' % re.match(r'(?:[^.:;]+[.:;]){2}', self.body).group() def save(self, *args, **kwargs): self.date = self.get_time() super(Gallery, self).save()
class Contribution(BaseModel): title = models.CharField( max_length=250, ) slug = models.SlugField( max_length=250, blank=True, null=True, ) contribution_type = models.ForeignKey('ContributionType') description = RedactorField() license = models.ForeignKey( 'License', blank=True, null=True, ) class Meta: ordering = ['slug'] def __unicode__(self): return u'%s' % (self.name) def save(self, *args, **kwargs): self.slug = slugify(str(self.name.encode('utf-8'))) super(Contribution, self).save(*args, **kwargs)
class Services(models.Model): """ Услуги """ main_title = models.CharField(max_length=32, verbose_name=u'Основной Заголовок') add_title = models.CharField(max_length=128, verbose_name=u'Подробный заголовок') body = RedactorField(verbose_name=u'Текст статьи') create_date = models.DateTimeField(verbose_name=u'Дата создания') active = models.BooleanField(default=True, verbose_name=u'Показывать') image = models.ImageField(verbose_name=u'Постер', blank=True, null=True) update_date = models.DateTimeField(auto_now=True, verbose_name=u'Дата изменения') slider = models.ManyToManyField(ImageTable, null=True, blank=True, related_name='services_slider') class Meta: verbose_name = verbose_name_plural = u'Услуги' def __unicode__(self): return self.main_title def get_absolute_url(self): return reverse('service', args=[ str(self.pk), ])
class Description(models.Model): language = models.ForeignKey(Language, on_delete=models.CASCADE) name = models.CharField(max_length=255,verbose_name='Name') text = RedactorField(null=True,verbose_name='Описание', redactor_options={'lang': 'ru'},upload_to='tmp/igroteka/',allow_file_upload=False,allow_image_upload=True) title = models.CharField(max_length=255,null=True) meta_description = models.CharField(max_length=255,null=True) meta_keywords = models.CharField(max_length=255,null=True) last_modified = models.DateTimeField(auto_now_add=True) class Meta: abstract = True verbose_name = 'Description' verbose_name_plural = 'Description' def save(self,*args,**kwargs): self.last_modified = timezone.now() if self.pk: from main.models import Meta template = Meta.objects.filter(language=self.language,model=list(dict(Meta.model_choices).values()).index(self.obj.model.__name__)).first() if template: self.title = self.title or template.title.format(**{'obj':self,'COMPANY_NAME':COMPANY_NAME}) self.meta_description = self.meta_description or template.meta_description.format(**{'obj':self,'COMPANY_NAME':COMPANY_NAME,'PHONES':' '.join(PHONES)})[:255] self.meta_keywords = self.meta_keywords or template.meta_keywords.format(**{'obj':self,'COMPANY_NAME':COMPANY_NAME,'PHONES':' '.join(PHONES)})[:255] super().save(*args,**kwargs) def __str__(self): return self.name or ''
class Post(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(unique=True, max_length=255) description = models.CharField(max_length=255, null=True, blank=True,help_text="Leave blank for auto-fill") author = models.ForeignKey(User, null=True, blank=True,editable=False) content = RedactorField(verbose_name=u'Text') published = models.BooleanField(default=True) created = models.DateTimeField(auto_now_add=True) tag = models.ManyToManyField(Tag, related_name="posts", related_query_name="post", blank=True) stock = models.ManyToManyField(Stock,related_name="posts",related_query_name="post", blank=True) imageURL = models.URLField(max_length=255, null=True, blank=True,help_text="Aim for 900x300 resolution") class Meta: ordering = ['-created'] def __unicode__(self): return u'%s' % self.title def get_absolute_url(self): return reverse('blog.views.post',args=[self.slug]) def get_comment_url(self): return reverse('blog.views.add_comment',args=[self.slug]) def save(self, *args, **kwargs): if self.content and (self.description is None or self.description == ""): suffix = "..." length = 100 content = strip_tags(self.content) self.description = content if len(content) <= length else content[:length-len(suffix)].rsplit(' ', 1)[0] + suffix super(Post, self).save(*args, **kwargs)
class Event(models.Model): title = models.CharField(verbose_name='Название', max_length=200) klass = models.CharField( verbose_name=u'Классы', max_length=100, blank=True, help_text='Не обязательно, например, 10-11 классы или 6-А класс.') date_begin = models.DateField(verbose_name='Дата начала', default=timezone.now) date_end = models.DateField( verbose_name='Дата окончания', blank=True, null=True, help_text='Не обязательно, для событий длительностью больше 1 дня') content = RedactorField( verbose_name='Текст', blank=True, null=True, help_text='Подробности мероприятия, расписание и т.п.') etype = models.IntegerField(verbose_name='Тип события', choices=CHOICE_TYPES, default=5) class Meta: verbose_name = 'Мероприятие' verbose_name_plural = 'Мероприятия' ordering = ('date_begin', ) def __str__(self): return self.title
class CategoryAdBoard(MetaModel, ActiveSortModel): title = models.CharField(max_length=500, verbose_name=u'заголовок') text = RedactorField(max_length=1000, verbose_name=u"описание") is_public = models.BooleanField(verbose_name=u'является публичной', default=False) objects = models.Manager() publics = PublicManager() def get_title(self): return self.title def get_text(self): return self.text def __unicode__(self): return self.get_title() @models.permalink def get_absolute_url(self): return ('category_ad_board_url', (), {'id': self.id}) @models.permalink def get_add_ad_url(self): return ('add_ad_board_url', (), {'id': self.id}) class Meta: verbose_name = u"категория объявлений" verbose_name_plural = u"категории объявлений"
class Story(models.Model): """A hunk of content for our site, generally corresponding to a page""" STATUS_CHOICES = ( (1, "Needs Edit"), (2, "Needs Approval"), (3, "Published"), (4, "Archived"), ) title = models.CharField(max_length=100) slug = models.SlugField() category = models.ForeignKey(Category) # html_content = HTMLField() html_content = RedactorField(verbose_name=u'Text') owner = models.ForeignKey(User) status = models.IntegerField(choices=STATUS_CHOICES, default=1) created = models.DateTimeField(default=datetime.datetime.now) modified = models.DateTimeField(default=datetime.datetime.now) is_top = models.BooleanField(default=False) class Meta: ordering = ['-is_top','-created'] verbose_name_plural = "stories" @permalink def get_absolute_url(self): return ("cms-story", (), {'slug': self.slug}) def save(self): self.modified = datetime.datetime.now() super(Story, self).save() admin_objects = models.Manager() objects = ViewableManager()
class Trombinoscope(TranslatableModel): """ Person Model """ translations = TranslatedFields( short_description=models.CharField(_('short description'), help_text=_("to be translated"), max_length=255), description=RedactorField(_('description'), help_text=_("to be translated"), null=True, blank=True), ) first_name = models.CharField(_('first name'), help_text=_("don't translate"), max_length=255) last_name = models.CharField(_('last name'), help_text=_("don't translate"), max_length=255) photo = ImageWithThumbsField(_('illustration'), help_text=_("don't translate"), sizes=settings.THUMBNAILS_TROMBINOSCOPE, max_length=255, upload_to="trombinoscope") position = models.PositiveIntegerField(default=0, blank=False, null=False) offices = models.ManyToManyField(Office) class Meta: verbose_name_plural = "Trombinoscope" ordering = ('position', ) def __unicode__(self): return "%s %s" % (self.first_name, self.last_name)
class Post(models.Model): title = models.CharField(max_length=300) slug = models.SlugField(max_length=100) body = RedactorField( verbose_name=u'Text', redactor_options={'lang': 'en', 'focus': 'true'}, upload_to='tmp/', allow_file_upload=True, allow_image_upload=True ) created = models.DateTimeField(auto_now_add=True) tags = select2.fields.ManyToManyField(Tag, blank=True, default = None) posted = select2.fields.ManyToManyField(Category) authors = select2.fields.ManyToManyField(Author, blank=True, default = None) theme = select2.fields.ForeignKey(Theme) first_image = models.ForeignKey(Images,null=True, blank=True, default = None) lead_photo = models.ImageField(upload_to=upload_image_to, blank=True, null=True) def __unicode__(self): return self.title def get_absolute_url(self): return '/blog/post/'+ self.slug def crop_first_image(self): return self.first_image def teaser(self): txt = re.sub("\{\{.*\}\}","",BeautifulSoup(self.body).text) i = 800 while len(txt) > i and txt[i-1] != ".": i += 1 if "(function" in txt: if txt.index("(function") < i: i = txt.index("(function") return txt[:i]
class Articulo (models.Model): def __unicode__(self): return unicode(self.titulo) or u'' publicado=models.BooleanField(default=False) visible_en_portada=models.BooleanField(default=False) fecha=models.DateTimeField() volanta=models.CharField(max_length=255, blank=True, null=True, default=None) titulo=models.CharField(max_length=255) slug = models.SlugField(blank=True, max_length=100) bajada=models.TextField(blank=True) texto=RedactorField() secciones=models.ManyToManyField(Seccion, blank=True, null=True, default=None) imagen=models.ImageField(upload_to='img-articulos', blank=True, default=None) video = EmbedVideoField(blank=True, null=True, default=None) principal=models.BooleanField(default=False) edicion=models.ForeignKey(Edicion, default=None, blank=True, null=True) permitir_comentarios=models.BooleanField(default=True) orden=models.IntegerField(blank=True, null=True) vistas=models.IntegerField(default=0) autor=models.ManyToManyField(Autor) def thumb(self): if self.imagen: img = get_thumbnail(self.imagen, '150x100', crop='center', quality=99) return '<img src="%s" width="100" height="100" />' % (img.url) else: return None thumb.allow_tags = True def get_absolute_url(self): return "/articulo/%i/%s/" % (self.id, self.slug)