如何在Django中过滤对象

时间:2015-08-29 15:34:55

标签: python django

models.py

<form id="formulaireReservationSalle" name="formulaireReservationSalle"  method="POST" data-role="validator">
    <?php if (isset($data)) { ?>
    <input type="hidden" id="identifiant" name="identifiant" value="<?php echo isset($data) ? $data[0]->identifiant : ''; ?>" />
    <?php } ?>
    <input type="hidden" id="salle_code" name="salle_code" value="<?php echo $salle_code; ?>" />
    <div class="flex-grid padding10">
        <div class="row"><div class="cell colspan12 margin10 header"><?php echo htmlentities($titre); ?></div></div>
        <div class="row">
            <div class="cell margin10">
                <div class="input-control modern select required">
                    <select name="clt_id" id="clt_id" data-validate-func="required" data-validate-hint="Ce champ est obligatoire">
                        <option value=""> -- S&eacute;lectionner un client -- </option>
                        <?php
                            $t_tabl = new Client();
                            $clients = $t_tabl->lireParCritere([]);
                            foreach ($clients as $client) {
                              $selected = (isset($data) && $client->clt_id == $data[0]->clt_id ? "selected" : "");
                              ?>
                                <option value="<?php echo $client->clt_id; ?>" <?php echo $selected; ?>><?php echo $client->noms; ?></option>
                              <?php
                            }
                        ?>
                    </select>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="cell margin10">
                <div class="input-control modern text required" data-role="input" id="date_deb">
                    <input type="text" name="date_debut" id="date_debut" data-validate-func="required" data-validate-hint="Ce champ est obligatoire" value="<?php echo isset($data) ? convertDateFormat3($data[0]->date_debut,'/') : ''; ?>" placeholder="Date d&eacute;but"/>
                    <span class="label">Date d&eacute;but</span>
                    <button class="button helper-button clear"><span class="mif-cross"></span></button>
                </div>
            </div>
            <div class="cell margin10">
                <div class="input-control modern text required" data-role="input">
                    <input type="text" name="heure_debut" id="heure_debut" value="<?php echo isset($data) ? $data[0]->hdeb : ''; ?>" placeholder="Heure d&eacute;but"/>
                    <span class="label">Heure d&eacute;but</span>
                    <button class="button helper-button clear"><span class="mif-cross"></span></button>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="cell margin10">
                <div class="input-control modern text" data-role="input" id="date_fin">
                    <input type="text" name="date_fin" id="date_fin" data-validate-func="required" data-validate-hint="Ce champ est obligatoire" value="<?php echo isset($data) ? convertDateFormat3($data[0]->date_fin,'/') : ''; ?>" placeholder="Date fin"/>
                    <span class="label">Date fin</span>
                    <button class="button helper-button clear"><span class="mif-cross"></span></button>
                </div>
            </div>
            <div class="cell margin10">
                <div class="input-control modern text" data-role="input">
                    <input type="text" name="heure_fin" id="heure_fin" value="<?php echo isset($data) ? $data[0]->hfin : ''; ?>" placeholder="Heure fin"/>
                    <span class="label">Heure fin</span>
                    <button class="button helper-button clear"><span class="mif-cross"></span></button>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="cell margin10">
                <div class="input-control modern textarea">
                    <textarea name="commentaire" id="commentaire" placeholder="Commentaire..."><?php echo isset($data) ? $data[0]->commentaire : ''; ?></textarea>
                </div>
            </div>
        </div>
        <div class="row input-control"></div>
        <div class="row flex-just-sa">
            <div class="cell margin10">
                <div id="btn_ok" class="button default">Valider</div>
            </div>
            <div class="cell margin10">
                <div id="btn_retour" class="button default">Annuler</div>
            </div>
        </div>
    </div>
</form>
<script type="text/javascript">
    $(document).ready(function() {

        $("#date_deb").datepicker();

        $("#heure_debut").datetimepicker({
            datepicker:false,
            format:'H:i',
            step:5
        });

        $("#date_fin").datepicker();

        $("#heure_fin").datetimepicker({
            datepicker:false,
            format:'H:i',
            step:5
        });

    });
</script>

目标实现:

class CampaignType(models.Model):
    name = models.CharField(max_length=100)

class Campaign(models.Model):
    name = models.CharField(max_length=200, unique=True)
    campaign_type = models.ForeignKey(CampaignType)

我如何实现上述&#39;嵌套&#39;在DJANGO模板? 我基本上想要根据类型对广告系列进行分类。 请帮忙。

4 个答案:

答案 0 :(得分:1)

您应该只使用Django自动为您提供的反向关系访问器,而不是尝试手动过滤。

{{1}}

答案 1 :(得分:0)

最好使用select_related选择广告系列,以便单个查询也可以使用所有CampaignType。

使用模板中的重新组合模板标记显示按CampaignType分组的广告系列。

查看

adsorbowanie
adsorpcje
adular
adwena
adwent
adwentnio
adwentysta
adwentystka
adwersarz
adwokacjo

模板

campaigns = Campaign.objects.all().select_related ()

答案 2 :(得分:-1)

您可以通过在上下文变量中设置列表列表来实现这一点,其中列表的每个元素都是一个广告系列类型的所有广告系列的列表。

要设置此类变量以便在模板中使用,请在视图中使用get_context_data()

见这里。

https://docs.djangoproject.com/en/1.8/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.get_context_data

- 假设您在变量campaign_types_list中进行设置,并且想要以campaign_type -> campaign格式呈现,那么在您的模板中,您将执行以下操作 -

{% for campaigns_in_campaign_type in campaign_type_list %}
    {% for campaign in campaigns_in_campaign_type %}
        {{ campaign.campaign_type}} -> {{ campaign }}
    {% endfor %}
{% endfor %}

修改

对于评论中给出的格式,您可以执行以下操作 -

{% for campaigns_in_campaign_type in campaign_type_list %}
    {% for campaign in campaigns_in_campaign_type %}
        {% if forloop.first %}
            {{ campaign.campaign_type}}
        {% endif %}
        {{ campaign }} 
    {% endfor %}
{% endfor %}

另外,请浏览django template-docs

答案 3 :(得分:-1)

如果我没记错的话,在Django中,它通常不赞成允许在模板逻辑中执行大量逻辑,尤其是查询数据库的逻辑。

为了实现您想要实现的目标,我觉得最好在一个定义良好的python容器中收集结果,然后将容器传递给模板进行渲染。

此外,如果您尝试将category_type映射到所有类别,那么您的逻辑似乎有点糊涂。

尝试这样的事情:

collect = []
for camp_type in CampaignType.objects.all()
    collect.append((camp_type, camp_type.campaign_set.all()))

然后尝试编写一个简单的嵌套for循环

{% for holder in collect %}
  <h1> {{ holder.0 }} </h1>
  {% for category in holder.1 %}
  <p>{{ category }}</p>
  {% endfor %}
{% endfor %}