1

次の問題があります。ユーザーが私のWebサイトでコースを受講しています。コースはいくつかの章で構成され、各章はいくつかのステップで構成されています。ユーザーがログインしてステップを完了すると、バックエンドが進行状況を保存します。ユーザーがサイトに戻ってきたら、中断したところから続行してほしい。これを行うには、cssクラス「アクティブ」を対応するナビゲーションステップと各章のコンテンツタブに追加する必要があります。私の出発点は、ユーザーがすでにステップを完了しているかどうかをifステートメントでテストすることでした。これはうまく機能しましたが、まだ完了していないすべてのステップに.activeを追加します。まだ終わっていない最初のステップに追加したいだけです。私は実際にこの問題を解決しましたが、それはかなり野蛮なハックであり、テンプレートに変数を設定できるカスタムテンプレートタグ

{% load custom_tags %}

{% for chapter in chapters %}
<div>
    <ul class="unstyled wizard clearfix">
        {% set active_wizard_steps = 0 %}
        {% for step in chapter.steps.all %}
        <li class="{% if not step.read and active_wizard_steps == 0 %}active{% set active_wizard_steps = 1 %}{% endif %}{% if step.read %} finished{% endif %}"></li>
        {% endfor %}
    </ul>
</div>
{% endfor %}

これは、すべてのアクティブなステップを含むリストまたはdictをテンプレートに渡し、ステップがそのリストにあるかどうかをテンプレートでテストすることによっても実行できることを知っています。しかし、それは多くのビューコードを書き直すことを意味するので、テンプレートで完全に書き直すことにしました。

だから私の質問は:この問題を解決するためのベストプラクティスの方法は何でしょうか?不思議なことに、問題を理解するのが本当に楽しかったので、私は尋ねています。どうもありがとう!

4

2 に答える 2

3

ステップにメソッドを追加します。

class Step(models.Model):
    # ...
    def is_active(self):
        # do your sauce

そしてテンプレートで:

class="{% if step.is_active %}active{% endif %}"

モデルにはget_absolute_urlのような便利なヘルパーがすでにありますが、これを追加してみませんか?

気に入らない場合は、テンプレートフィルタを実行して、次のように使用できます。

class="{% if step|is_active %}active{% endif %}"

アップデート

別の方法は、次のようにテンプレートフィルターを作成することです。

@register.filter
def set_active_steps(steps):
    active_wizard_steps = 0

    for step in steps:
        if not step.read and active_wizard_steps == 0:
            step.is_active = True

    return steps

次に、テンプレートで:

{% for step in chapter.steps.all|set_active_steps %}
    ... {% if step.is_active %}...{% endif %}
{% endfor %}
于 2012-09-17T13:18:54.290 に答える
0

私はあなたがすでにあなたの問題を解決したことを知っています、私は完成のために別の答えを投稿しています。

{% for %}{% endfor %}現在のウィザードステップをループ内の現在のアイテムと照合してクラスを設定する必要がある場合は、次のコードを使用できます。

{% for step in wizard.steps.all %}
    <li class="{% if wizard.steps.step1 == forloop.counter %}active{% elif wizard.steps.step1 > forloop.counter %} complete{% endif %}">
          <span class="step">{{ forloop.counter }}</span>
    </li>
 {% endfor %}
于 2014-12-08T13:47:02.210 に答える