我想显示用户模型中用户的用户名,名字和姓氏,然后从UserProfile中显示匹配的城市和国家。

这些是模型:

# this is the model for city
class City(models.Model):
    name = models.CharField(max_length=128, default="", unique=True)
    country = models.CharField(max_length=128, default="Scotland")
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(City, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.name

# this is model for user
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    profilepic = models.ImageField(blank=True)

    city = models.ForeignKey(City)
    slug = models.SlugField(unique=True)


    def save(self, *args, **kwargs):
        # Uncomment if you don't want the slug to change every time the name changes
        self.slug = slugify(self.user.username)
        super(UserProfile, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.user.username

    @property
    def avg_rating(User):
        return self.userrating_set.all().aggregate(Avg('rating'))['rating__avg']


这是视图:

def index(request):
    user_list = User.objects.order_by('-userrating')[:5]
    user_profile_list = UserProfile.objects.all()
    city_list = City.objects.order_by('-name')[:5]

    context_dict = {"users": user_list, "cities" : city_list, "profiles" : user_profile_list}

    return render(request, "index.html", context_dict)


这是模板:

            {% if users %}
                <ul>
                    {% for user in users %}
                    {% for profile in profiles %}

                        <li><p><a href="user/{{ user.slug }}"
                                  style="color:rgba(0,0,200,1.00)">{{ user.username }} {{ user.first_name }} {{ user.last_name }}</a>
                            from <a href="city/{{ user.city.slug }}"
                                    style="color:rgba(0,0,200,1.00)">{{ profile.city.name }}</a>, {{ user.city.country }}, {{ user.avg_rating }}
                        </p></li>

                    {% endfor %}
                    {% endfor %}


但是,它显示一个拥有所有城市而不是匹配城市的用户。

像这样:


  来自斯托尔霍尔姆的Crystal Gillespie,
  
  来自斯托尔霍尔姆的Crystal Gillespie,
  
  crystalgillespie来自圣保罗的Crystal Gillespie ,,
  
  crystalgillespie来自巴黎的Crystal Gillespie,
  
  来自格拉斯哥的Crystal Gillespie,
  
  crystalgillespie来自马德里的Crystal Gillespie ,,
  
  crystalgillespie来自马德里的Crystal Gillespie ,,
  
  来自斯托尔霍尔姆的Crystal Gillespie,
  
  来自格拉斯哥的Crystal Gillespie,
  
  crystalgillespie来自马德里的Crystal Gillespie ,,
  
  crystalgillespie来自巴黎的Crystal Gillespie,
  
  来自斯托尔霍尔姆的Crystal Gillespie,
  
  来自格拉斯哥的Crystal Gillespie,
  
  crystalgillespie来自马德里的Crystal Gillespie ,,
  
  crystalgillespie来自慕尼黑的Crystal Gillespie,


谢谢。

最佳答案

从用户对象中,您可以使用user.userprofile将外键跟随到个人资料,然后使用user.userprofile.city从那里到达城市。

这是您模板的简化版本。

{% for user in users %}
    {{ user.username }}
    {{ user.userprofile.profilepic }}
    {{ user.userprofile.city.name }}
{% endfor %}


请注意,这意味着您无需获取视图中的配置文件和城市。您可以使用select_related减少sql查询的数量:

def index(request):
    user_list = User.objects.select_related()[:5]
    context_dict = {"users": user_list}
    return render(request, "index.html", context_dict)

08-17 11:49