【问题标题】:Counter increment in template outside of for loopfor循环外模板中的计数器增量
【发布时间】:2019-03-12 05:12:32
【问题描述】:

我需要在循环中进行计数器增量。我查看了 django for.counter,但不幸的是,我的增量并不完全发生在循环的每次迭代中。那么有什么方法可以在 django 模板中实现变量的增量,而无需费力地在我的代码中实现一个新对象来做到这一点而没有这样的增量?

在下面的代码中,我写了{{ count = 0 }}{{ count += 1 }}这行代码只是为了说明。我知道这行不通。以下是我的模板的一个非常简化的形式:

<div class="jumbotron slotgroup slotavailable mb-1 mt-5" id="jumbo_week_avail">
  <div class="slot-header" role="alert">
    Headertext
  </div>
  {% if weeklyslotsav %}
    {% for day,daynum in weekzip %}
    {{ count = 0 }}
      {% if daynum in weeklyslotsav.day %}
        {% for weekslotav in weeklyslotsav %}
          {% if weekslotav.day == daynum %}
          <div class="row row_week_avail{{ weekslotav.day }}" id="row_week_avail{{ weekslotav.day }}_{{ count }}">
          </div>
          {{ count += 1 }}
          {% endif}
        {% endfor %}
      {% else %}
      <div class="row row_week_avail{{ daynum }}" id="row_week_avail{{ daynum }}_0">
      </div>
      {% endif %}
    {% endfor %}
  {% else %}
    {% for weekday, weeknum in weekzip %}
    <div class="row row_week_avail{{ weeknum }}" id="row_week_avail{{ weeknum }}_0">
    </div>
    {% endfor %}
  {% endif %}
</div>

以下是我的观点:

def edit_doctorslots(request, cliniclabel, doctor_id):
    doctor_id=int(doctor_id)
    doc = get_object_or_404(doctor, docid=doctor_id)
    cl = Clinic.objects.get(label=cliniclabel)
    print("Clinic name", cl.name)
    regularslotsav = ''
    try:
        regularslotsav = Timeslots.objects.filter(clinic =cl, doctor =doc, available =True)
    except:
        pass
    regularslotsbr = ''
    try:
        regularslotsbr = Timeslots.objects.filter(clinic =cl, doctor =doc, available =False)
    except:
        pass

    weekavzip = ''
    try:
        weeklyslotsav = Weekdays.objects.filter(clinic =cl, doctor =doc, available =True)
        weekav = range(0, len(weeklyslotsav))
        weekavzip = list(zip(weeklyslotsav, weekav))
    except:
        pass
    weeklyslotsbr = ''
    try:
        weeklyslotsbr = Weekdays.objects.filter(clinic =cl, doctor =doc, available =False)
    except:
        pass

    formslot = SlotForm()
    formspecialdays = SpecialdaysForm()
    formweekdays = WeekdaysForm()
    weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
    weekdaynum = [0,1,2,3,4,5,6]
    weekzip = list(zip(weekdays, weekdaynum))
    newweekzip = weekzip

    return render(request, 'clinic/editslots0.html', {'rnd_num': randomnumber(), 'clinic': cl, 'doctor': doc, 'formslot': formslot, 'formspecialdays': formspecialdays, 'formweekdays': formweekdays, 'weekzip': weekzip, 'newweekzip': newweekzip, 'regav': regularslotsav, 'regbr': regularslotsbr, 'weekav': weekavzip, 'weekbr': weeklyslotsbr, 'weeklyslotsav': weeklyslotsav })

我见过很多关于 SO 的类似问题。但是在所有这些中,我都看到有人介绍for.counter。但这不适合我的目的。

【问题讨论】:

  • 然后您需要“将逻辑移动到视图级别”。请不要在模板中编写命令式代码。 Django 模板故意使这很难避免人们编写这样的语句。您将不得不在视图中添加一些逻辑,例如每次迭代都会添加 counter 的值。
  • @WillemVanOnsem 然后很遗憾我将不得不在 sql 中添加额外的冗余行。
  • 没有@Johan,因为 for.counter 不能解决我的问题
  • @Droidzone:不,只需将数据添加到视图传递给模板的“对象”。就像您对 zip(..) 所做的那样。

标签: python django python-3.x django-templates


【解决方案1】:

您可以使用with标签将模板中的变量设置为-

{% with count=0  %}        
   {{ count}}
    ...do other stuffs 
{% endwith %}

对于数学,您可以使用 django math filters 之类的

{{ count|add:"1" }}

您可以同时使用这两种代码。

有关在 django 模板中设置变量的更多信息 - How to set a value of a variable inside a template code?

以及在 django 中使用数学 - How to do math in a Django template?

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 2014-09-14
    • 2019-05-23
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2011-11-24
    相关资源
    最近更新 更多