for循环django中的get_profile替代方案

时间:2011-10-10 12:24:54

标签: django

我正在尝试获取基于扩展配置文件模型的用户头像的信息。我通常通过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}

2 个答案:

答案 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调用而没有检查正确的值。