AttributeError: объект «str» не имеет атрибута «_meta»

Я только начинаю изучать Django, и сегодня перехожу к части комментариев, я просто практикуюсь с Django Document.https://docs.djangoproject.com/en/1.4/ref/contrib/comments/example/. Команда для добавления формы комментария работает хорошо, когда я тренируюсь на странице DetailView, но теперь я также хочу добавить форму комментария на страницу ListView, после чего возникает эта ошибка.

ниже приведена трассировка: Среда: Метод запроса: GET

Django Version: 1.4.3
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'books',
'django.contrib.comments')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')


Template error:
In template /home/ryu/emacs/emacs-code/djcode/mysite2/templates/books/publisher_list.html, error at line 19
'str' object has no attribute '_meta'


9 :   <th> website</th>


10 : </tr>


11 : {% for publisher in object_list %}


12 : <tr>


13 :   <th><a href="/mysite2/publishers/{{publisher.id}}">{{ publisher.name }}</a></th>  


14 :   <th>{{publisher.country}}</th>


15 :   <th>{{publisher.website}}</th>


16 : </tr> 


17 : {% endfor %}


18 : </table>


19 :  {% render_comment_list for books.publisher %} 


20 : {% endblock %}


21 : 
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
136.                     response = response.render()
File "/usr/local/lib/python2.7/dist-packages/django/template/response.py" in render
104.             self._set_content(self.rendered_content)
File "/usr/local/lib/python2.7/dist-packages/django/template/response.py" in       rendered_content
81.         content = template.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
140.             return self._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
134.         return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
823.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
74.             return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
123.         return compiled_parent._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
134.         return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
823.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
74.             return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
123.         return compiled_parent._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
134.         return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
823.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
74.             return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
62.             result = block.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
823.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
74.             return node.render(context)
File "/usr/local/lib/python2.7/dist-          packages/django/contrib/comments/templatetags/comments.py" in render
201.         ctype, object_pk = self.get_target_ctype_pk(context)
File "/usr/local/lib/python2.7/dist- packages/django/contrib/comments/templatetags/comments.py" in get_target_ctype_pk
100.             return ContentType.objects.get_for_model(obj), obj.pk
File "/usr/local/lib/python2.7/dist-packages/django/contrib/contenttypes/models.py" in get_for_model
32.         opts = self._get_opts(model)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/contenttypes/models.py" in   _get_opts
20.         return model._meta.concrete_model._meta

Exception Type: AttributeError at /mysite2/publishers/
Exception Value: 'str' object has no attribute '_meta'

теперь я хочу знать, как я могу добавить комментарий на каждую страницу, используя встроенные комментарии ??


person ryu    schedule 24.01.2013    source источник
comment
Является ли books.publisher внешним ключом или charfield   -  person CJ4    schedule 24.01.2013
comment
books — это имя приложения, издатель — название модели.   -  person ryu    schedule 24.01.2013
comment
Может быть, то, как я спрашиваю, усложняет этот вопрос.   -  person ryu    schedule 24.01.2013
comment
привет, Чарл, я думаю, что должен более четко сформулировать свой вопрос в комментарии к psjinx. если возможно, пожалуйста, обратитесь и помогите вернуться.   -  person ryu    schedule 24.01.2013


Ответы (2)


То, что вы говорите, это то, что вы передаете appname.modelname в тег шаблона, вы должны фактически передать экземпляр модели в тег шаблона примерно так:

{% render_comment_list for publisher %}

если издатель является экземпляром модели издателя, как это выглядит в вашем коде. Или альтернативно:

{% render_comment_list for books.publisher publisher.id %}

как упоминалось выше psjinx.

person CJ4    schedule 24.01.2013
comment
Да, я также пытаюсь назначить экземпляр, и я сделал так, как вы сказали, но все еще не работает. хотя {% render_comment_form for books.publisher publisher.id%} больше не сообщает об ошибке, но на странице ничего не отображается... вы знаете, если это DetailView, то текущий объект может быть представлен объектом, который просто используется для назначения того, к какому объекту привязываться. но когда дело доходит до ListView, я не знаю, как представить текущий объект. у вас есть другое предложение? - person ryu; 24.01.2013
comment
Если у объектов нет комментариев, комментарии не будут отображаться в списке комментариев, но если это не так, вы также можете попробовать это: {% get_comment_list для издателя как comment_list %}{% для комментария в comment_list %}{{ comment }} {% конец для %} - person CJ4; 24.01.2013
comment
очень ценю ваш ранний ответ. и, кстати, в последнем ответе я обновил, чтобы создать форму. код, который вы вставляете, я пробовал раньше, но это приведет к тому же сообщению об ошибке, что объект «str» не имеет атрибута «_meta». так что у вас есть опыт добавления комментария на страницу без публикации.. - person ryu; 24.01.2013
comment
не могли бы вы рассказать мне какой-нибудь другой метод для реализации цели добавления комментария на обычную страницу, которая не использует метод публикации. я думаю, что это должно быть очень распространенной проблемой, но поскольку я новичок в django. эта проблема меня очень сильно раздражает.. - person ryu; 24.01.2013
comment
Тег шаблона комментария должен работать для большинства объектов из коробки. - person CJ4; 25.01.2013
comment
дружище, все равно спасибо. Я публикую более распространенный способ спросить. теперь вы не против помочь также link. - person ryu; 25.01.2013

Тег render_comment_list ожидает object, но вы передаете unicode string. book.publisher в строке 19, где возникает исключение, выглядит как строка.

Вы можете увидеть действительные аргументы здесь< /а>. Вот исходный код этого тега:

@register.tag
def render_comment_list(parser, token):
    """
    Render the comment list (as returned by ``{% get_comment_list %}``)
    through the ``comments/list.html`` template

    Syntax::

        {% render_comment_list for [object] %}
        {% render_comment_list for [app].[model] [object_id] %}

    Example usage::

        {% render_comment_list for event %}

    """
    return RenderCommentListNode.handle_token(parser, token)
person pankaj28843    schedule 24.01.2013
comment
Извините, я не совсем понимаю этот код. Вам все равно, что у меня есть трассировка, и дело в том, как я могу добавить форму комментария/список/количество на обычную страницу, ниже urls.py urlpatterns = Patterns('', url(r'^publishers/$',ListView.as_view(model=Publisher,),name='publishers'), url(r'^publishers/(?P‹pk›\d+)$' , DetailView.as_view(model=Publisher, template_name='books/post.html')),) - person ryu; 24.01.2013
comment
(render_comment_form для объекта) хорошо работает для URL /publishers/2. но когда дело доходит до /publishers/, которые могут отображать все элементы построчно, теперь я также хочу добавить встроенный комментарий, а затем запутался. так у вас есть какие-либо предложения по этому поводу? - person ryu; 24.01.2013