0
            {%  for voter in opt.voterlog_set.all  %}
                {% if user.id != voter.voter.id %}
                    <span data-url="{% url vote %}" data-id="{{ opt.id }}" class="button">vote</span>
                {% endif %}
            {% endfor %}

上記のコードでは、現在のユーザーがまだ投票していない場合にのみ、投票オプションを表示したいと考えています。上記のコードは、投票オプションを複数回出力します (voterlog のエントリごとに 1 回)。Django では、hasVoted 変数を切り替えるために使用できるブール値などのカスタム変数を設定できません。Django テンプレートを使用してこのコードを修正するにはどうすればよいですか?

ご協力いただきありがとうございます

4

2 に答える 2

0

あなたが言及したように、Django テンプレートで状態を設定する方法がないため、ビュー コードにアクセスできない場合、これを行う適切な方法はありません。ビュー コードにアクセスできる場合、最も簡単な解決策 (そして全体として最も正しい解決策) はuser_has_voted、テンプレートの投票ログを反復処理するのではなく、ビューにコンテキスト変数を設定することです。

ただし、ビューにアクセスできない場合は、Javascript をレンダリングして必要な状態を設定し、さらに Javascript を追加してその状態を確認し、DOM を調整するなど、クライアント側のコードを含むハックを使用する必要があります。ページが読み込まれた後。

しかし、あなたの論理は間違っているようです。次のように、現在のユーザーがループ内で見つかった場合にのみ、状態を設定するものが必要になります。

        {%  for voter in opt.voterlog_set.all  %}
            {% if user.id == voter.voter.id %}
            <script type="text/javascript">
            window.user_has_voted = true;
            </script>
            {% endif %}
        {% endfor %}

        <script type="text/javascript">
        if( !window.user_has_voted ) {
          document.write('<span data-url="{% url vote %}" data-id="{{ opt.id }}" class="button">vote</span>');
        }
        </script>

これは特に厄介なハックであることに注意してください。テンプレートにしかアクセスできず、テンプレートに送信されるコンテキスト変数を制御できない場合にのみ使用してください。

于 2012-06-18T04:13:12.850 に答える
0

おそらくこれはあなたが望むものではありませんが、ビューで有権者のリストを作成し、それをテンプレート コンテキストに追加するのはどうでしょうか。それで

{% if user not in voters %}
    "user is allowed to vote"
{% endif %}
于 2012-06-18T06:43:28.643 に答える