2017-08-11 1 views
0

J'utilise Django pour créer un site web pour les entraîneurs de gym. ce que je veux est un modèle pour les horaires quotidiens de tous les formateurs comme celui-ci Comment afficher les horaires quotidiens de tous les utilisateurs de Django?

Mais, ma page est enter image description here

Le problème est le « td » de par le tr formateur répète autant que le nombre de les horaires du formateur a. Je sais que le {% for sc in schedules %} est le problème. Mais, parce que les horaires sont l'ensemble de la requête, je devrais utiliser le pour et en utilisant pour, je devrais vérifier le bon moment pour insérer le calendrier à la bonne position tr, td. Comment puis-je faire la table réussie pour montrer les horaires quotidiens de tous les utilisateurs (formateurs) ?? Tout le monde sera très utile pour moi.

Schedule.model

class Schedule(models.Model): 
    Trainer = models.ForeignKey(settings.AUTH_USER_MODEL,blank=True,null=True, related_name='schedule', on_delete=models.SET_NULL) 
    title = models.CharField(max_length=12,blank=True,) 

    start = models.DateTimeField(null=True, blank=True) 

mon views.py

def staff_daily_schedule_search(request): 

all_schedules = Schedule.objects.all() 
Fitness_list = User.objects.filter(groups__name='Fitness') # Fitness Trainers 

search_date1 = request.GET.get('search_date','') 
search_date= datetime.datetime.strptime(search_date1, '%Y-%m-%d') #%T = %H:%M:%S '%Y-%m-%d' 

schedules= Schedule.objects.none() 
for f in Fitness_list: 
    sc = f.schedule.filter(start__year=search_date.year).filter(start__month = search_date.month).filter(start__day = search_date.day) 
    print(sc) 
    schedules |= sc 

context = { 
    'search_date' : search_date1 if search_date1 else datetime.date.today(), 
    'Fitness_list':Fitness_list, 
    'schedules' : schedules, 
} 
return render(request, 'management/staff_daily_schedule.html', context) 

staff_daily_schedule.html

<form action="{% url 'management:staff_daily_schedule_search' %}" method="GET"> 
    <span><input type="date" class="search_date my-control" name="search_date" value="{{ search_date }}" ></span> 
      <a id="today" class="btn btn-warning">오늘</a> 
    <button class="btn btn-info" value="검색" >검색</button> 
</form> 
<table class="table table-bordered"> 
<thead> 
    <tr> 
     <th></th> 
     <th>06:00 </th> 
     <th>07:00 ~ 07:50</th> 
     <th>08:00 ~ 08:50</th> 
     <th>09:00 ~ 09:50</th> 
     <th>10:00 ~ 10:50</th> 
    </tr> 
</thead> 
<tbody> 
    {% for trainer in Fitness_list %} 
    <tr> 
     <td>{{ trainer }} </td> 

      {% for sc in schedules %} <!-- because of this for, td repeats as many as the number of schedule per trainer has..--> 
      {% if sc.Trainer == trainer %} 

       {% if sc.start.hour == 21 %} <!--HOUR of 6:00 a.m = 21--> 
        <td>{{ sc }}</td> 
       {% else %} 
        <td ></td> 
       {% endif %} 

       {% if sc.start.hour == 22 %} 
        <td>{{ sc }}</td> 
       {% else %} 
        <td ></td> 
       {% endif %} 

       {% if sc.start.hour == 23 %} 
        <td>{{ sc }}</td> 
       {% else %} 
        <td ></td> 
       {% endif %} 

       {% if sc.start.hour == 0 %} <!-- 9 a.m. --> 
        <td>{{ sc }}</td> 
       {% else %} 
        <td></td> 
       {% endif %} 

       {% if sc.start.hour == 1 %} 
        <td>{{ sc }}</td> 
       {% else %} 
        <td></td> 
       {% endif %} 
      {% endif %} 
      {% endfor %} 


    </tr> 
    {% endfor %} <!-- tr repetition as trainers number--> 

</tbody> 

</table> 

Le problème

Répondre

0

Si vous mettez la logique dans vos vues du modèle, il est facile de configurer la table exactement comme vous le voulez.

[Edité utiliser un OrderedDict pour préserver l'ordre des formateurs.]

views.py

def staff_daily_schedule_search(request): 

    Fitness_list = User.objects.filter(groups__name='Fitness') # Fitness Trainers 

    search_date1 = request.GET.get('search_date','') 
    search_date= datetime.datetime.strptime(search_date1, '%Y-%m-%d') #%T = %H:%M:%S '%Y-%m-%d' 

    trainer_dict = OrderedDict() 
    # Initialize each row of the table with the trainer's name and a blank schedule 
    for f in Fitness_list: 
     trainer_dict[str(f.id)] = {'name': f.get_full_name(), 'hour_21': '', 
      'hour_22': '', 'hour_23': '', 'hour_0': '', 'hour_1': ''} 

    schedules = Schedule.objects.filter(start__year=search_date.year).filter(start__month = 
     search_date.month).filter(start__day = search_date.day) 
    # Insert each schedule item into the appropriate table row and cell 
    for sc in schedules: 
     trainer_dict[str(sc.Trainer.id)]['hour_' + str(sc.start.hour)] = sc.title 

    context = { 
     'search_date' : search_date1 if search_date1 else datetime.date.today(), 
     'trainer_dict': trainer_dict 
    } 
    return render(request, 'management/staff_daily_schedule.html', context) 

staff_daily_schedule.html

<form action="{% url 'management:staff_daily_schedule_search' %}" method="GET"> 
    <span><input type="date" class="search_date my-control" name="search_date" value="{{ search_date }}" ></span> 
      <a id="today" class="btn btn-warning">오늘</a> 
    <button class="btn btn-info" value="검색" >검색</button> 
</form> 
<table class="table table-bordered"> 
<thead> 
    <tr> 
     <th></th> 
     <th>06:00 </th> 
     <th>07:00 ~ 07:50</th> 
     <th>08:00 ~ 08:50</th> 
     <th>09:00 ~ 09:50</th> 
     <th>10:00 ~ 10:50</th> 
    </tr> 
</thead> 
<tbody> 
    {% for trainer in trainer_dict %} 
     <tr> 
      <td>{{ trainer.name }}</td> 
      <td>{{ trainer.hour_21 }}</td> 
      <td>{{ trainer.hour_22 }}</td> 
      <td>{{ trainer.hour_23 }}</td> 
      <td>{{ trainer.hour_0 }}</td> 
      <td>{{ trainer.hour_1 }}</td> 
     </tr> 
    {% endfor %} 
</tbody> 

</table> 
+0

Merci! Mais, trainer.hour_21 a une erreur: les objets 'str' n'ont pas d'attribut 'hour_21'. Donc, {{trainer.hour_21, 22 ..}} ne montre rien. – Julia

+0

ajoutant 'trainer_dict = trainer_dict.items()' dans les vues et en changeant le '{% for trainer, training in trainer_dict%}' '{{training.hour_21}}' dans le modèle a résolu le problème. Merci beaucoup, à feuilles persistantes! – Julia