如何在模板中的相同布局中返回用户帖子? Django的

时间:2017-04-19 13:24:36

标签: django

在摘要页面上,我显示了所有用户最喜欢的帖子:飞机和航空公司。

我已经获得了飞机上的优惠帖子,但由于飞机型号与航空公司的型号非常相似,我不想为航空公司的帖子创建第二部分。我想将帖子合并到同一部分。

航空公司型号只有不同的领域,如:车队规模,没有。目的地,联盟。他们的风格我两个都是一样的。我如何合并它们?我知道你使用if语句,但我对如何做到感到困惑?

查看

def account_overview(request):
    fav_aircraft = FavoritedAircraft.objects.filter(user__id=request.user.id)
    fav_airline = FavoritedAirline.objects.filter(user__id=request.user.id)
    return render(request, 'account/account_overview.html', {'favAircraft':fav_aircraft,'favAirline':fav_airline})

模板

{% if favorite %}
    {% for favorite in favAircraft %}
    <div class="col-lg-offset-0 col-md-4 col-sm-3 item">
      <div class="box"><img src="{{ favorite.aircraft.image.url }}" width="200px" height="200px" alt="{{ favorite.aircraft.title }}"/></a>
          <h3 class="name"><a href="{{ favorite.get_absolute_url }}">{{ favorite.aircraft.name }}</a></h3>
          <h4>Manufacturer: <i>{{ favorite.aircraft.manufacturer }}</i></h4>
          <h4>Range: <i>{{ favorite.aircraft.maximum_range }} NM</i></h4>
          <h4> Passengers: <i>{{ favorite.aircraft.passengers }}</i></h4>
          <h4> Speed: <i>{{ favorite.aircraft.cruising_speed }} KT</i></h4>
          <button class=" favorite btn btn-default {% if aircraft.id in favorited_aircraft_ids %}added{% endif %}" data-aircraft-id="{{ aircraft.id }}"><span class="add">Add</span><span class="remove">Remove</span> Favorite</button>
        </div>
    </div>
    {%endfor%}
{% else %}
  <h2 class="text-center">Opps.. You don't seem to have any favourited posts..</h2></div>
{% endif %}

4 个答案:

答案 0 :(得分:0)

来自itertools导入链

final_list = list(chain(fav_aircraft,fav_airline))

答案 1 :(得分:0)

我在这里看到两个解决方案:

  1. 您可以在包含飞机和航空公司对象的视图中创建单个列表,并为其指定通用名称,以便在模板中显示它们

  2. 创建另一个代码段html模板,并在原始模板中包含两次,一次使用航空公司对象和飞机对象一次

答案 2 :(得分:0)

将两个循环放在同一个div中你的模板

{% if favorite %}
    <div class="col-lg-offset-0 col-md-4 col-sm-3 item">
        {% for favorite in favAircraft %}
          <div class="box"><img src="{{ favorite.aircraft.image.url }}" width="200px" height="200px" alt="{{ favorite.aircraft.title }}"/></a>
          <h3 class="name"><a href="{{ favorite.get_absolute_url }}">{{ favorite.aircraft.name }}</a></h3>
          <h4>Manufacturer: <i>{{ favorite.aircraft.manufacturer }}</i></h4>
          <h4>Range: <i>{{ favorite.aircraft.maximum_range }} NM</i></h4>
          <h4> Passengers: <i>{{ favorite.aircraft.passengers }}</i></h4>
          <h4> Speed: <i>{{ favorite.aircraft.cruising_speed }} KT</i></h4>
          <button class=" favorite btn btn-default {% if aircraft.id in favorited_aircraft_ids %}added{% endif %}" data-aircraft-id="{{ aircraft.id }}"><span class="add">Add</span><span class="remove">Remove</span> Favorite</button>
        </div>
        {%endfor%}

        {% for favorite in favAirline %}
          <div class="box"><img src="{{ favorite.airline.image.url }}" width="200px" height="200px" alt="{{ favorite.airline.title }}"/></a>
          <h3 class="name"><a href="{{ favorite.get_absolute_url }}">{{ favorite.airline.name }}</a></h3>
          <h4>Alliance: <i>{{ favorite.airline. alliance }}</i></h4>
          <h4>Fleet Size: <i>{{ favorite.airline.fleet_size }} NM</i></h4>
          <h4> No. of Destinations: <i>{{ favorite.airline.no_of_destinations }}</i></h4>
          <button class=" favorite btn btn-default {% if airline.id in favorited_airline_ids %}added{% endif %}" data-airline-id="{{ airline.id }}"><span class="add">Add</span><span class="remove">Remove</span> Favorite</button>
        </div>
        {%endfor%}
    </div>
{% else %}
  <h2 class="text-center">Opps.. You don't seem to have any favourited posts..</h2></div>
{% endif %}

答案 3 :(得分:0)

组合两个不同模型的查询集可以简单也可以非常复杂,具体取决于您对结果的处理方式。

但首先让我们来看看你当前的视图和模板,特别是if语句:

{% if favorite %}

但您的上下文字典中没有名为favorite的变量:

return render(request, 'account/account_overview.html', {'favAircraft':fav_aircraft,'favAirline':fav_airline})

所以要解决这个问题,我会将此添加到您的视图中:

favorite = fav_aircraft.exists() or fav_airline.exists()

这是你的渲染电话:

return render(request, 'account/account_overview.html', {'favAircraft':fav_aircraft,'favAirline':fav_airline, 'favorite':favorite})

完成此操作后,您的if语句应该在模板中正常工作 现在谈到更复杂的问题,迭代飞机和航空公司。

现在,一种方式(不是真的推荐)只是在你的模板中使用两个循环,但正如我刚才所说的那样,不建议这样做,如果只使用常用属性,它会不必要地混乱模板。

相反,我们会在视图中保留所有与模型相关的逻辑,因此我们需要的是一个包含两个查询集内容的列表:

favorites = list(fav_aircraft) + list(fav_airline)

执行此操作后,您不再需要自己喜欢的变量,因为我们只需检查模板中的收藏夹,在执行此操作后我们也不再需要两个单独的查询集,因此render语句变得安静简单:

return render(request, 'account/account_overview.html', {'favorites':favorites})

最终视图代码为:

def account_overview(request):
  fav_aircraft = FavoritedAircraft.objects.filter(user__id=request.user.id)
  fav_airline = FavoritedAirline.objects.filter(user__id=request.user.id)
  favorites = list(fav_aircraft) + list(fav_airline)
  return render(request, 'account/account_overview.html', {'favorites':favorites})

现在你的模板应该是这样的:

{% if favorites %}
    {% for favorite in favorites %}
    <div class="col-lg-offset-0 col-md-4 col-sm-3 item">
      <div class="box"><img src="{{ favorite.aircraft.image.url }}" width="200px" height="200px" alt="{{ favorite.aircraft.title }}"/></a>
          <h3 class="name"><a href="{{ favorite.get_absolute_url }}">{{ favorite.aircraft.name }}</a></h3>
          <h4>Manufacturer: <i>{{ favorite.aircraft.manufacturer }}</i></h4>
          <h4>Range: <i>{{ favorite.aircraft.maximum_range }} NM</i></h4>
          <h4> Passengers: <i>{{ favorite.aircraft.passengers }}</i></h4>
          <h4> Speed: <i>{{ favorite.aircraft.cruising_speed }} KT</i></h4>
          <button class=" favorite btn btn-default {% if aircraft.id in favorited_aircraft_ids %}added{% endif %}" data-aircraft-id="{{ aircraft.id }}"><span class="add">Add</span><span class="remove">Remove</span> Favorite</button>
        </div>
    </div>
    {%endfor%}
{% else %}
  <h2 class="text-center">Opps.. You don't seem to have any favourited posts..</h2></div>
{% endif %}

这个答案花了比预期更长的时间:/