2010-11-25 19 views
0

Je crée une liste d'utilisateurs présents dans ma base de données, ils sont affichés dans le modèle user_list.html en utilisant des vues génériques, mais mes modèles héritent de nombreuses propriétés d'autres classes dans le modèle. Maintenant, je veux que lorsqu'un utilisateur clique sur son nom, il devrait être redirigé vers la page user_detail.html et il devrait obtenir ses coordonnées ici. Les détails doivent être extraits de la base de données, il suffit de sélectionner les valeurs du même modèle pour lequel le jeu de requête est défini.Générer des modèles à l'aide de la liste, afficher des vues génériques

mon views.py ressemble tellement

from django.contrib.auth.models import User 
    from django.shortcuts import render_to_response, get_object_or_404 
    from django.views.generic.list_detail import object_list, object_detail 

    from contacts.models import * 

    def employee_list(request, queryset=None, **kwargs): 
     if queryset is None: 
      queryset = Employee.objects.all() 
     return object_list(
      request, 
      queryset=queryset, 
      paginate_by=20, 
      **kwargs) 

    def employee_detail(request, employee_id): 
     return object_detail(
      request, 
      queryset= Employee.objects.all(), 
     # extra_context ={"EC_list": EmergencyContact.objects.all()}, 
      object_id=employee_id) 

urls.py

from contacts.views import employees 

    urlpatterns = patterns('', 
     url(r'^$', 
      employees.employee_list, 
      name='contacts_employee_list'), 
     url(r'^(?P<employee_id>\d+)/$', 
      employees.employee_detail, 
      name='contacts_employee_detail'), 

mon employee_deatil.html ressemble

{% block title %} Employee details {% endblock %} 
    {% block heading1%}<h1> Employee's Details </h1>{% endblock %} 
    {% block right_menu %} 
     {% if object %} 
     <ul> 
      <li> Name:{{ object.full_name }}</li> 
      <li> Contact No.: {{ object.phone_number }}</li> 
     <!-- <li> Refrence Contact No.: {{ EC_list.contact }}</li> --> 
      <li> Blood Group: {{ object.blood_type }}</li> 
      <li> Martial Status: {{ object.martial_status }}</li> 
      <li> Nationality: {{ object.about }}</li> 
      <!-- <li> Relationship: {{ EC_list.relationship }}</li> 
      <li>Course: {{ object.course }}</li> --> 
     </ul> 
     {% else %} 
      No Registered user present. 
     {% endif %} 
    {% endblock %} 

s'il vous plaît aidez-moi à comprendre que comment peut J'affiche toutes les données de l'employé qui est présent dans les autres modèles. Je vous remercie!

+2

Pas du tout une bonne idée d'inclure des numéros de ligne dans le code. Vous devriez les enlever. – pyfunc

+0

Quel est votre problème? Qu'est-ce qui ne fonctionne pas actuellement? Qu'attendez-vous de voir, et que voyez-vous à la place? –

+0

Bonjour mon pote Je voulais remplir mon template par tous les détails disponibles dans les modèles de base de données. Mes modèles ont aussi des relations Foreignkey etc et je ne suis pas capable de montrer les attributs de mes modèles qui ont une relation de clé étrangère avec un autre modèle. – Prateek

Répondre

0

Si je vous comprends bien, vous voulez afficher des informations sur l'employé qui est stocké dans d'autres modèles. Je suppose que vous savez que vous pouvez pré-filtrer dans la vue et envoyer une variable de contexte supplémentaire avec un jeu de requête. L'utilisation de votre ligne existante extra_context ="EC_list": EmergencyContact.objects.all() en sélectionne trop. Je suppose que votre modèle EmergencyContact a une clé étrangère à l'employé (employee = ForeignKey(Employee, related_name='emergency_contacts')). Dans ce cas, vous devez transmettre votre contexte supplémentaire filtré.

def employee_detail(request, employee_id): 
    return object_detail(
     request, 
     queryset= Employee.objects.all(), 
     extra_context ={"EC_list": EmergencyContact.objects.filter(employee__pk=employee_id)}, 
     object_id=employee_id) 

Ceci filtrera la liste uniquement aux contacts d'urgence dont vous avez besoin.

{% block title %} Employee details {% endblock %} 
{% block heading1%}<h1> Employee's Details </h1>{% endblock %} 
{% block right_menu %} 
    {% if object %} 
     <ul> 
     <li> Name:{{ object.full_name }}</li> 
     <li> Contact No.: {{ object.phone_number }}</li> 
     <li> Blood Group: {{ object.blood_type }}</li> 
     <li> Martial Status: {{ object.martial_status }}</li> 
     <li> Nationality: {{ object.about }}</li> 
     <li> Course: {{ object.course }}</li> 
     <li> Emergency Contacts: 
      <ul> 
      {% for EC in EC_list %} 
      <li> Name: {{ EC.name }} </li> 
      <li> Contact No.: {{ EC.contact }}</li> 
      <li> Relationship: {{ EC.relationship }}</li> 
      {% endfor %} 
      </ul> 
     </li> 
    </ul> 
    {% else %} 
     No Registered user present. 
    {% endif %} 
{% endblock %} 

Bien sûr, ce n'est qu'une façon de le faire. Si vous n'avez pas besoin de filtres sophistiqués sur les contacts d'urgence, vous pouvez utiliser les recherches inversées de clés étrangères dans le modèle. à savoir se débarrasser des extra_context pour EC_list et remplacer la fonction de rendu contact avec ceci:

 <li> Emergency Contacts: 
      <ul> 
      {% for EC in object.emergency_contacts %} 
      <li> Name: {{ EC.name }} </li> 
      <li> Contact No.: {{ EC.contact }}</li> 
      <li> Relationship: {{ EC.relationship }}</li> 
      {% endfor %} 
      </ul> 
     </li> 

Rappelez-vous que nous avons employee = ForeignKey(Employee, related_name='emergency_contacts') comme une clé étrangère de EmergencyContact à l'employé. non seulement cette déclaration ajoute le champ employé à EmergencyContact, mais il ajoute un champ virtual supplémentaire à Employee avec le nom 'emergency_contacts'. ce champ virtuel renvoie un jeu de requête de tous les contacts d'urgence liés à l'employé actuel.

Laissez-moi savoir si vous avez des questions ou avez besoin de liens vers la documentation

EDIT: pour l'amour de la lisibilité, considder définissant le paramètre template_object_name de la vue générique.

def employee_detail(request, employee_id): 
    return object_detail(request, queryset= Employee.objects.all(), 
        object_id=employee_id, template_object_name='employee') 

------------------------------------------------------------------------------------------ 

     <li> Name: {{ employee.full_name }}</li> 
     <li> Emergency Contacts: 
      <ul> 
      {% for EC in employee.emergency_contacts %} 
      <li> Name: {{ EC.name }} </li> 
      <li> Contact No.: {{ EC.contact }}</li> 
      <li> Relationship: {{ EC.relationship }}</li> 
      {% endfor %} 
      </ul> 
     </li> 
+0

Merci pour votre réponse merveilleuse cela fonctionne vraiment ,,,,,, et si vous pouviez m'envoyer quelques liens connexes pour cet article que je serai très reconnaissant à vous ......... – Prateek

+0

Bonjour cher, maintenant je voulait afficher les attributs qui sont eux-mêmes une clé étrangère d'autres classes alors comment les appeler dans mon template.example: J'ai EmergencyContact qui a un attribut contact = models.ForeignKey (Personne, verbose_name = _ ('contact'), related_name = 'emergency_contact_to') mais cette classe Person a aussi son attribut phone_number pointant vers une autre classe ie phone_number = generic.GenericRelation ('PhoneNumber'). Je ne suis pas en mesure d'accéder au numéro de téléphone. alors comment puis-je le montrer dans le modèle. – Prateek

+0

pouvez-vous poster les définitions de modèles connexes? – Thomas