“object”“str”“object”“没有”“get”“url”“属性。”

2024-05-19 09:16:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的sitemap页面上,我的django项目出现了'str' object has no attribute 'get_absolute_url'错误。感谢任何帮助。在

这是我的回溯:

回溯:

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文件

^{pr2}$

以及我的两个相关模型(Deal和Post),其中我创建了一个get_absolute_url方法,因为它之前在站点地图上生成了一个错误:

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

还有我的网址.py相关信息存档

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'),

Tags: djangopyselftruegetmodelslocallength
1条回答
网友
1楼 · 发布于 2024-05-19 09:16:02

您没有正确遵循StaticViewSitemap的example。正如文档所说,从items()返回的元素被传递给location()方法;由于这些项通常是模型实例,因此该方法的默认实现是调用每个实例的get_absolute_url()方法。在您的例子中,您传递的是URL名称,因此您需要适当地重新定义location(),就像这个例子一样。在

def location(self, item):
    return reverse(item)

相关问题 更多 >

    热门问题