Ошибка: AttributeError at /info 'str' object has no attribute '_meta'

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Я подключаю комментарии к django-проекты, используя django-comments-xtd.

Используя код шаблона из документации возникает ошибка: 'str' object has no attribute '_meta'. Как ее исправить?

Шаблон:
HTML:
{% get_comment_count for object as comment_count %}
<div class="py-4 text-center">
  <a href="{% url 'home' %}">Back</a>
  &nbsp;&sdot;&nbsp;
  {{ comment_count }} comment{{ comment_count|pluralize }}
  ha{{ comment_count|pluralize:"s,ve" }} been posted.
</div>

Ошибка вызывается из-за вот этой строки:
Код:
{% get_comment_count for object as comment_count %}

Что такое object, Переменная во views или объект модели?(которые у меня не прописаны)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Только что заметил что у вас вьюха не корректная:
Python:
class Comment(TemplateView):
    template_name = "registration/comments.html"

    def get_comments(request):
        # до этого нужно создать один экземпляр класса Comment
        comment = Comment.objects.get(pk=1)
        print(comment) # что выводит в консоль
        return render(request, {'comment': comment})
так работать не будет, так как метод get_comments не будет вызываться и в шаблон ничего не будет передаваться.
Попробуйте так:
Python:
class Comment(TemplateView):
    template_name = "registration/comments.html"


    def get_context_data(self, **kwargs):
        context = super(Comment, self).get_context_data(**kwargs)
        comment = Comment.objects.get(pk=1)
        print(comment) # что выводит в консоль
        context['comment'] = comment
        return context
 
  • Мне нравится
Реакции: Domohod45

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Что такое object, Переменная во views или объект модели?(которые у меня не прописаны)
Судя по примеру в документации object - это объект модели (в примере это экземпляр класса Post).
 
  • Мне нравится
Реакции: Domohod45

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Ясно. Но что должен хранить в себе object?
Экземпляр класса модели. Каких-то требований по полям я не увидел. В примере модель такая:
Python:
class Post(models.Model):
    STATUS_CHOICES = (
        ('DRAFT', 'Draft'),
        ('PUB', 'Published'),
    )
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    body = models.TextField()
    status = models.CharField(max_length=5, choices=STATUS_CHOICES,
                              default="DRAFT")
    allow_comments = models.BooleanField('allow comments', default=True)
    publish = models.DateTimeField(default=timezone.now)
    objects = PostManager()

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post-detail',
                       kwargs={'year': self.publish.year,
                               'month': self.publish.strftime('%b'),
                               'day': self.publish.strftime('%d'),
                               'slug': self.slug})
но можно использовать любую другую, например:
Python:
class Post(models.Model):
    title = models.CharField(max_length=250)   
    body = models.TextField()
и в шаблоне поменять object на post или на имя модели если модель называется по другому:
HTML:
{% get_comment_count for post as comment_count %}
<div class="py-4 text-center">
  <a href="{% url 'home' %}">Back</a>
  &nbsp;&sdot;&nbsp;
  {{ comment_count }} comment{{ comment_count|pluralize }}
  ha{{ comment_count|pluralize:"s,ve" }} been posted.
</div>
 
  • Мне нравится
Реакции: Domohod45

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
То есть, можно просто прописать пустую модель и вывести её имя в шаблон? (если к примеру комментарии не должны быть привязаны к постам, а просто выводиться на отдельной странице)
Проверил, можно пустую модель. Только нужно в нее добавить метод get_absolute_url чтобы после публикации комментария не было ошибки.
 
  • Мне нравится
Реакции: Domohod45

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Правильно ли я указал имя модели?
Нужно чтобы в переменной comment была ссылка на экземпляр класса Comment, то есть нужно передать его в шаблон:
Python:
def get_comments(requests):
    # до этого нужно создать один экземпляр класса Comment
    comment = Comments.objects.get(pk=1)
    return render(request, 'comment.html', {'comment': comment})
HTML:
{% get_comment_count for comment as comment_count %}
<div class="py-4 text-center">
  <a href="{% url 'home' %}">Back</a>
  &nbsp;&sdot;&nbsp;
  {{ comment_count }} comment{{ comment_count|pluralize }}
  ha{{ comment_count|pluralize:"s,ve" }} been posted.
</div>
 
  • Мне нравится
Реакции: Domohod45

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Не вижу, что выводит print.
Чтобы увидеть можно из шаблона пока убрать вывод комментариев.
 
  • Мне нравится
Реакции: Domohod45

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Теперь следующая ошибка:
type object 'Comments' has no attribute 'objects'
Это из-за того, что имя модели и вьюхи совпадают, нужно переименовать:
Python:
class Comment2(TemplateView):
    template_name = "registration/comments.html"


    def get_context_data(self, **kwargs):
        # в методе super тоже не забудьте переименовать
        context = super(Comment2, self).get_context_data(**kwargs)
        comment = Comment.objects.get(pk=1)
        print(comment) # что выводит в консоль
        context['comment'] = comment
        return context
Я использую PyCharm, и он ругается на имя класса вью, что оно повторяется. Пообзывал я его по-разному - продолжает ругаться.
Переименуйте вручную, и в ссылках (urls) тоже не забудьте переименовать.
 
  • Мне нравится
Реакции: Domohod45

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Судя по примеру в документации object - это объект модели (в примере это экземпляр класса Post).
Ясно. Но что должен хранить в себе object?
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Экземпляр класса модели. Каких-то требований по полям я не увидел. В примере модель такая:
Python:
class Post(models.Model):
    STATUS_CHOICES = (
        ('DRAFT', 'Draft'),
        ('PUB', 'Published'),
    )
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    body = models.TextField()
    status = models.CharField(max_length=5, choices=STATUS_CHOICES,
                              default="DRAFT")
    allow_comments = models.BooleanField('allow comments', default=True)
    publish = models.DateTimeField(default=timezone.now)
    objects = PostManager()

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post-detail',
                       kwargs={'year': self.publish.year,
                               'month': self.publish.strftime('%b'),
                               'day': self.publish.strftime('%d'),
                               'slug': self.slug})
но можно использовать любую другую, например:
Python:
class Post(models.Model):
    title = models.CharField(max_length=250)  
    body = models.TextField()
и в шаблоне поменять object на post или на имя модели если модель называется по другому:
HTML:
{% get_comment_count for post as comment_count %}
<div class="py-4 text-center">
  <a href="{% url 'home' %}">Back</a>
  &nbsp;&sdot;&nbsp;
  {{ comment_count }} comment{{ comment_count|pluralize }}
  ha{{ comment_count|pluralize:"s,ve" }} been posted.
</div>
То есть, можно просто прописать пустую модель и вывести её имя в шаблон? (если к примеру комментарии не должны быть привязаны к постам, а просто выводиться на отдельной странице)
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
и в шаблоне поменять object на post или на имя модели если модель называется по другому:
Правильно ли я указал имя модели?

model:
Python:
class Comment(models.Model):

    def get_absolute_url(self):
        return self.get_url()

шаблон:
Код:
{% get_comment_count for comment as comment_count %}

Но все та же ошибка.
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Нужно чтобы в переменной comment была ссылка на экземпляр класса Comment, то есть нужно передать его в шаблон
Та же ошибка.

views:
Python:
class Comment(TemplateView):
    template_name = "registration/comments.html"

    def get_comments(request):
        # до этого нужно создать один экземпляр класса Comment
        comment = Comment.objects.get(pk=1)
        return render(request, {'comment': comment})
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Та же ошибка.

views:
Python:
class Comment(TemplateView):
    template_name = "registration/comments.html"

    def get_comments(request):
        # до этого нужно создать один экземпляр класса Comment
        comment = Comment.objects.get(pk=1)
        return render(request, {'comment': comment})
А, я не создал экземпляр. Сейчас исправлю.
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
А, я не создал экземпляр. Сейчас исправлю.
все равно ошибка...
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
все равно ошибка...
Покажите что передается в шаблон:
Python:
class Comment(TemplateView):
    template_name = "registration/comments.html"

    def get_comments(request):
        # до этого нужно создать один экземпляр класса Comment
        comment = Comment.objects.get(pk=1)
        print(comment) # что выводит в консоль
        return render(request, {'comment': comment})
Также возможно проблема в названиях классов (модели и вью), так как django-comments-xtd использует 2 модели, одна из которых называется Comment.
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Покажите что передается в шаблон:
Python:
class Comment(TemplateView):
    template_name = "registration/comments.html"

    def get_comments(request):
        # до этого нужно создать один экземпляр класса Comment
        comment = Comment.objects.get(pk=1)
        print(comment) # что выводит в консоль
        return render(request, {'comment': comment})
Также возможно проблема в названиях классов (модели и вью), так как django-comments-xtd использует 2 модели, одна из которых называется Comment.
Изменил названия вью и модели - не помогло. Не вижу, что выводит print.

Код:
Quit the server with CTRL-BREAK.
[05/Jan/2022 21:59:39] "GET / HTTP/1.1" 200 2143
[05/Jan/2022 21:59:40] "GET / HTTP/1.1" 200 2143
[05/Jan/2022 21:59:40] "GET / HTTP/1.1" 200 2143
Internal Server Error: /info
Traceback (most recent call last):
    *пути*
    model = model._meta.concrete_model
AttributeError: 'str' object has no attribute '_meta'
[05/Jan/2022 21:59:45] "GET /info HTTP/1.1" 500 154727
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Чтобы увидеть можно из шаблона пока убрать вывод комментариев.
Код:
Quit the server with CTRL-BREAK.
[05/Jan/2022 22:09:35] "GET /info HTTP/1.1" 200 1036
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Теперь следующая ошибка:
type object 'Comments' has no attribute 'objects'

Я использую PyCharm, и он ругается на имя класса вью, что оно повторяется. Пообзывал я его по-разному - продолжает ругаться.


1641449570674.png
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Это из-за того, что имя модели и вьюхи совпадают, нужно переименовать:
Спасибо и пожалуй последний вопрос. Правильно ли я указал absolute_ur.? Происходят ошибки, когда перехожу по ссылкам.

url:
Python:
    path('info', Comment2.as_view(), name='comment'),

model:
Python:
class Comment(models.Model):
    title = models.CharField(max_length=30, default="tit")

    def get_absolute_url(self):
        return reverse("comment")
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Правильно ли я указал absolute_ur.?
Вроде правильно.
 
  • Мне нравится
Реакции: Domohod45

Форум IT Специалистов