我正在尝试获取基于扩展配置文件模型的用户头像的信息。我通常通过get_profile()调用这些信息。但是在这种情况下,调用是在模板中的for循环中,如果其中一个用户是相同的,我会收到错误。
我将如何避免此错误?
{% for fevent in fevents %}
<!-- EVENT ><! -->
<div class="event">
<div class="pic">
<a href="" class="notification" title="{{ fevent.getPublishedPredictionsCount }} Predictions">{{ fevent.getPublishedPredictionsCount }}</a>
<img src="{% thumbnail fevent.artwork.get_absolute_url 100x98 crop,upscale %}" alt="" width="100" height="98" />
<div class="overlay">
<a href=""></a>
</div>
</div>
<h1><a href="">{{ fevent.title|trunchar:30 }}</a></h1>
{% autoescape off %}
{{ fevent.getEventPredictionScore|makestars }}
{% endautoescape %}
<ul class="details">
<li class="cat">
Category: <a href="">{{ fevent.catagory }}</a>
</li>
<li class="location">
{{ fevent.location }}
</li>
<li class="date">
{{ fevent.date_and_time }}
</li>
<li class="time">
7:00pm - 8:00pm
</li>
</ul>
<!-- CLEAR ><! --><div class="clear"></div>
<div class="hype">
<div class="avatar">
<a href="" class="overlay" title="{{ fevent.owner.get_full_name }}"></a><img src="{% thumbnail fevent.owner.get_profile.avatar.get_absolute_url 120x120 crop,upscale %}" alt="" width="120" height="120" />
</div>
<p>{{ fevent.description|trunchar:200 }}… <a href="">Read More</a></p>
</div>
<!-- CLEAR ><! --><div class="clear"></div>
</div>
<!-- END OF EVENT ><! -->
{% endfor %}
问题在于:
{% thumbnail fevent.owner.get_profile.avatar.get_absolute_url 120x120 crop,upscale %}
返回错误消息:
Caught MultipleObjectsReturned while rendering: get() returned more than one UserProfile -- it returned 2! Lookup parameters were {'user__id__exact': 4L}
答案 0 :(得分:3)
要扩展Matt所说的内容,使用get_or_create
是一个好主意,您绝对应该使用User
定义您的个人资料模型的OneToOneField
链接,而不是ForeignKey
}。
user = models.OneToOneField(User, verbose_name=_(u'user'))
现在,如果您忘记使用get_or_create()
,或者以某种方式意外尝试为同一用户创建重复的配置文件,则数据库将引发IntegrityError
。
答案 1 :(得分:2)
该错误意味着数据库中有两个UserProfile
个对象与get_profile
使用的查询匹配,而不是get_profile
被调用两次。您需要从数据库中删除其中一个配置文件对象,并确保没有再次创建多个配置文件。您应该可以多次使用get_profile
方法而不会出现问题。也许你在该函数中有一个get_or_create
调用而没有检查正确的值。