2015-01-25 3 views
0

Я создаю потоки активности для пользователя, используя сигналы и типы контента. Действия создаются сигналами post_save. Однако у меня возникают проблемы с отображением этих действий в шаблоне.django - AttributeError - объект 'unicode' не имеет атрибута 'META'

Я получаю эту ошибку:

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 %} 

ответ

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, 
    }) 
Смежные вопросы