首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django站点地图--“str”对象没有属性'get_absolute_url‘错误

Django站点地图--“str”对象没有属性'get_absolute_url‘错误
EN

Stack Overflow用户
提问于 2018-04-06 19:53:04
回答 2查看 1.4K关注 0票数 1

我在sitemap页面上的django项目上得到了'str' object has no attribute 'get_absolute_url'错误。任何帮助都是非常感谢的。

这是我的回溯:

回溯:

代码语言:javascript
运行
复制
File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\sitemaps\views.py" in inner
  16.         response = func(request, *args, **kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\sitemaps\views.py" in sitemap
  71.                                       protocol=req_protocol))

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\sitemaps\__init__.py" in get_urls
  111.             urls = self._urls(page, protocol, domain)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\sitemaps\__init__.py" in _urls
  120.             loc = "%s://%s%s" % (protocol, domain, self.__get('location', item))

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\sitemaps\__init__.py" in __get
  68.             return attr(obj)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\sitemaps\__init__.py" in location
  75.         return obj.get_absolute_url()

Exception Type: AttributeError at /sitemap.xml
Exception Value: 'str' object has no attribute 'get_absolute_url'

我的sitemaps.py文件

代码语言:javascript
运行
复制
from django.contrib import sitemaps
from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from deals.models import Deal
from blog.models import Post

class StaticViewSitemap(sitemaps.Sitemap):
    priority = 1.0
    changefreq = 'daily'

    def items(self):
        return ['about', 'contact', 'disclosure', 'terms', 'privacy', 'deals:deals', 'blog:blog']


class BlogSitemap(Sitemap):
    changfreq = "daily"
    priority = 1.0
    location ='/blog'

    def items(self):
        return Post.objects.filter(status='Published')

    def lastmod(self, obj):
        return obj.created


class DealSitemap(Sitemap):
    changfreq = "daily"
    priority = 1.0

    def items(self):
        return Deal.objects.all()

    def lastmod(self, obj):
        return obj.date_added

还有我的两个相关模型(Deal和Post),其中我创建了一个get_absolute_url方法,因为它在sitemap上产生了一个错误:

代码语言:javascript
运行
复制
class Deal(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=140, unique=True)
    description = RichTextUploadingField(default='')
    retailer = models.ForeignKey(Retailer, on_delete=models.CASCADE)
    image = VersatileImageField('deal image',
                               upload_to=deal_upload_path,
                               null=True,
                               blank=True)
    link = models.URLField(max_length=2000, default='')
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    date_added = models.DateField(default=timezone.now)
    date_expires = models.DateField(default=timezone.now)
    price = models.CharField(max_length=140)
    secondary_price = models.CharField(max_length=140, default='')
    likes_total = models.IntegerField(default=1)
    expired = models.BooleanField(default=False)

    def __str__(self):
        return "@{} ({})".format(self.title, self.retailer)

    def _get_unique_slug(self):
        slug = slugify(self.title)
        unique_slug = slug
        num = 1
        while Deal.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, num)
            num += 1
        return unique_slug

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = self._get_unique_slug()
        super().save()

    def get_label(self):
        if self.date_added > datetime.date.today() - datetime.timedelta(days=4):
            return "<span class='"'notify-badge'"'>new</span>"

        else:
            return ''

    def get_absolute_url(self):
        return reverse('deals:deal_detail', kwargs={'slug': self.slug})

class Post(models.Model):
    STATUS_CHOICES = (
        ('Published', 'Published'),
        ('Draft', 'Draft'),
    )
    title = models.CharField(max_length=100, unique=True)
    body = RichTextUploadingField()
    category = models.ForeignKey(BlogCategory, on_delete=models.CASCADE)
    seo_title = models.CharField(max_length=60, blank=True, null=True)
    seo_description = models.CharField(max_length=165, blank=True, null=True)
    slug = models.SlugField(max_length=200, unique=True)
    image = VersatileImageField('blog image',
                               upload_to='media/blog_images',
                               null=True,
                               blank=True)
    created = models.DateTimeField(db_index=True, auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, default='Draft', choices=STATUS_CHOICES)

    def get_absolute_url(self):
        return reverse('blog:blog_post', kwargs={'slug': self.slug})

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

还有我的urls.py文件和相关信息

代码语言:javascript
运行
复制
from django.contrib.sitemaps.views import sitemap

sitemaps = {
    'static': StaticViewSitemap,
    'blog': BlogSitemap,
    'deals': DealSitemap
}

path('sitemap.xml', sitemap,
         {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap'),
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-06 20:00:45

对于示例,您还没有正确地跟踪StaticViewSitemap。正如文档所述,从items()返回的元素被传递给location()方法;由于项通常是模型实例,因此该方法的默认实现是调用每个实例的get_absolute_url()方法。在您的示例中,您传递的是URL名称,因此需要适当地重新定义location() --就像示例所做的那样。

代码语言:javascript
运行
复制
def location(self, item):
    return reverse(item)
票数 3
EN

Stack Overflow用户

发布于 2021-03-03 10:04:33

location()函数请求get_absolute_url()方法:这里。如果您认为您的字符串已经是一个绝对路径,那么您可以简单地通过以下方法在类中重写它:

代码语言:javascript
运行
复制
def location(self, item) :
    return item

这将返回您已经设置的绝对路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49700123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档