2016-05-05 12 views
0

Ich habe eine Vorlage mit einer Tabelle, und ich habe alle Objekte auf einer Abfrage. Jedes Objekt kann verwandte Objekte haben oder nicht. Angenommen, dies ist, was ich tun muss, ist für jedes Objekt zu prüfen, ob dieses verwandte Objekt vorhanden ist oder nicht. Wenn nicht in der Tabelle, habe ich ein Feld, um einen Link zu erstellen, um ein verwandtes Objekt zu erstellen, aber wenn ein Symbol angezeigt wird, um dieses Objekt zu sehen.Django überprüfen Sie alle Objekte einer Abfrage, um zu sehen, ob verwandte Objekte haben und verwenden Sie diese auf Vorlage

Ich kann mit dem einen der "Eltern" -Objekt tun, aber ich weiß nicht, wie zu tun, wenn ich mehr als ein Objekt in der Abfrage habe.

Modelle zu überprüfen:

class Accident(models.Model): 
    employee = models.ForeignKey(Employee) 
    place = models.IntegerField(choices=ACCIDENT_PLACE, default=1) 
    detail = models.CharField(max_length=255) 
    clinic = models.ForeignKey(Clinic) 
    is_urgency = models.BooleanField(default=False) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    created_by = models.ForeignKey(User, 
       related_name='accidents_created_by', 
       editable=False, 
       blank=True, 
       null=True 
       ) 
    modified_by = models.ForeignKey(User, 
       related_name='accidents_modified_by', 
       editable=False, 
       blank=True, 
       null=True 
       ) 


    class Meta: 
     verbose_name = "accidente" 
     verbose_name_plural = "accidentes" 

    def __str__(self): 
     return str(self.id) 


class AccidentCertificate(models.Model): 
    accident = models.ForeignKey(Accident) 
    diagnostic = models.CharField(max_length=150) 
    return_day = models.DateField() 
    notes = models.CharField(max_length=255) 
    medication = models.CharField(max_length=255) 
    doctor = models.ForeignKey(Doctor) 
    presented = models.BooleanField(default=False) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    created_by = models.ForeignKey(User, 
       related_name='acc_certificates_created_by', 
       editable=False, 
       blank=True, 
       null=True 
       ) 
    modified_by = models.ForeignKey(User, 
       related_name='acc_certificates_modified_by', 
       editable=False, 
       blank=True, 
       null=True 
       ) 


    class Meta: 
     verbose_name = "certificado de accidente" 
     verbose_name_plural = "certificados de accidente" 
     ordering = ["-id"] 


    def __str__(self): 
     return str(self.id) 

dies meine Ansicht nach (überprüfen, nur ein Objekt, das ich weiß bereits, dass 1 im Zusammenhang Objekt hat)

class EmployeeDetailView(LoginRequiredMixin, DetailView): 
    # Chequeamos que el usuario se encuentre logeado 
    login_url = reverse_lazy('users:login') 

    model = Employee 
    template_name = 'employees/detail.html' 
    pk_url_kwarg = 'employee_id' 

    def get_context_data(self, **kwargs): 
     context_object_name = 'employee' 
     context = super(EmployeeDetailView, self).get_context_data(**kwargs) 
     employee = context['employee'] 
     context['cuil'] = employee.cuil[:2]+'-'+employee.cuil[2:10]+'-'+employee.cuil[-1:] 
     # Tomamos los accidentes correspondientes al empleado 
     # y los pasamos al contexto 
     employee_accidents = Accident.objects.filter(employee=employee) 
     context['accidents'] = employee_accidents 

     # Tomamos el certificado del accidente si existe 
     accident_certificate = AccidentCertificate.objects.get(accident=employee_accidents) 
     return context 

und in der Vorlage

<table class="table table-striped"> 
        <thead> 
         <tr> 
          <th>ID Acc.</th> 
          <th>Fecha</th> 
          <th>Cant. Días</th> 
          <th>Locación</th> 
          <th>Detalle</th> 
          <th>Clinica</th> 
          <th>Urgencia</th> 
          <th>Cargado por</th> 
          <th>Certificado</th> 
          <th>Segimiento</th> 
         </tr> 
        </thead> 

        <tbody> 
         {% for a in accidents %} 
         <tr> 
          <td>{{ a.id }}</td> 
          <td>{{ a.created|date }}</td> 
          <td>-</td> 
          <td>{{ a.get_place_display }}</td> 
          <td>{{ a.detail }}</td> 
          <td>{{ a.clinic }}</td> 
          <td> 
          {% if a.is_urgency %} 
           Si 
          {% else %} 
           No 
          {% endif %} 
          </td> 
          <td>{{ a.created_by }}</td> 
          <td><a href="{% url 'accidents:add_certificate' a.id %}">{% bootstrap_icon "search" %}</a></td> 
          <td>{% bootstrap_icon "search" %}</td> 
         </tr> 
         {% empty %} 
         <p class="text-center"> 
          <strong>NO HAY REGISTROS</strong> 
         </p> 
         {% endfor %}  
        </tbody> 
       </table> 

Gut in sintesis Ich muss jeden Unfall nehmen, der einem Angestellten und für jeden Unfall entspricht t Überprüfen Sie, ob dieses über ein AccidentCertificate verfügt, ob es den Link in die Tabelle gesetzt hat, um das Zertifikat zu sehen, und wenn nicht, um den Link zum Erstellen des Zertifikats zu erstellen.

+0

Von Ihren Modellen sieht es aus wie kann es bei einem Unfall mehr als ein Unfall Zertifikat sein? – AKS

Antwort

1

Sie können eine Zählannotation verwenden, um jedem Unfall die Anzahl der zugehörigen Zertifikate hinzuzufügen, und diese Nummer dann in einer if-Anweisung in der Vorlage verwenden.

from django.db.models import Count 
... 
employee_accidents = Accident.objects.filter(employee=employee).annotate(certificate_count=Count('accidentcertificate')) 

...

{% for a in accidents %} 
... 
{% if a.certificate_count == 0 %} 
    <a href="whatever">Add new certificate</a> 
{% endif %} 
{% endfor %} 
+0

Vielen Dank !!!!! – marcosgue