【问题标题】:django - AttributeError - 'unicode' object has no attribute 'META'django - AttributeError - 'unicode' 对象没有属性 'META'
【发布时间】:2015-03-24 00:33:42
【问题描述】:

我正在使用信号和内容类型为用户创建活动流。活动是由 post_save 信号创建的。但是,我在模板中显示这些活动时遇到问题。

我收到此错误:

AttributeError at /user/user_activities/

'unicode' object has no attribute 'META'

而显示为错误的行是这一行:

{{ activity.get_rendered_html }}

我不知道为什么会收到此错误。如果您能告诉我如何解决这个问题,我将非常感激。谢谢。

这是活动模型:

class Activity(models.Model):
    actor = models.ForeignKey(User)
    action = models.CharField(max_length=100)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)

    class Meta:
        verbose_name = 'Activity'
        verbose_name_plural = 'Activities'
        ordering = ['-pub_date']

    def __unicode__(self):
        return ("%s %s") % (self.actor.username, self.action)

    def get_rendered_html(self):
        template_name = '%s_activity.html' %(self.content_type.name)
        return render(template_name, {
            'object':self.content_object,
            'actor':self.actor,
            'action':self.action,
        })

get_rendered_html() 的模板:

<div class="user_activity">
    <p>{{ actor.username }} {{ action }} {{ object.user }}'s status</p>

    <p>{{ object.body }}</p>

    {% if object.image %}
        <div class="activity_img_wrapper">
            <p><img src="/media/{{ object.image }}"/></p>
        </div>
    {% endif %}
</div>

在视图中:

def user_activities(request, user_name):
    user = User.objects.get(username=unquote(user_name))
    activities = Activity.objects.filter(actor=user)
    return render(request,'user_activites.html', {
        'activities_of':user,
        'activities':activities
    })

最后在模板中:

{% block content %}
    <div id="activities_wrapper">
        {% if activities.count > 0 %}
            {% for activity in activities %}
                <div class="activity">
                    {{ activity.get_rendered_html }}
                </div>
            {% endfor %}
        {% else %}
            <div class="activity">
                <p>No activity</p>
            </div>
        {% endif %}
    </div>
{% endblock %}

【问题讨论】:

    标签: django django-models django-templates django-views


    【解决方案1】:

    错误在Activity.get_rendered_html() 方法中。

    django.shortcuts.render 期望 request 对象作为它的第一个参数。你应该使用render_to_string 而不是render

    from django.template.loader import render_to_string
    
    def get_rendered_html(self):
        template_name = '%s_activity.html' %(self.content_type.name)
        return render_to_string(template_name, {
            'object':self.content_object,
            'actor':self.actor,
            'action':self.action,
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 2013-06-29
      • 2016-01-05
      • 2017-05-19
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多