Problème table d'association Django-Python

Fermé
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023 - 3 juin 2014 à 11:25
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023 - 4 juin 2014 à 10:00
Bonjour, Je développe un site web pour le lycée ou j'effectue mon stage en python avec le framework django. Mon site va permettre aux utilisateurs de visualiser l'inventaire informatique du lycée, la configuration des machines et de demander une maintenance sur un poste précis.

J'ai repris ma BD sur PHPMyAdmin et je l'ai exporter en models pour django. J'ai une table salle, une table matériel et une table inventaire avec dedans num_salle et id_mat. Voici la déclaration de mes modèles :

class Materiel(models.Model):
    id_mat = models.IntegerField(primary_key=True)
    modele_mat = models.CharField(max_length=30)
    date_recep = models.TextField()
    marque_mat = models.CharField(max_length=30)
    addmac = models.TextField()
    proc_mat = models.TextField()
    mem_mat = models.TextField()
    dd_mat = models.TextField()
    id_type_mat = models.IntegerField()
    class Meta:
        managed = False
        db_table = 'Materiel'

class Salle(models.Model):
    id_salle = models.IntegerField(primary_key=True)
    num_salle = models.CharField(max_length=30)
    description = models.TextField(max_length=15)
    nombre_poste = models.IntegerField()
    class Meta:
        managed = False
        db_table = 'Salle'

class Emplacement(models.Model):
    id_empl = models.IntegerField(primary_key=True)
    id_mat = models.ForeignKey(Materiel, db_column='id_mat')
    date = models.DateField()
    num_salle = models.ForeignKey(Salle, db_column='num_salle')
    class Meta:
        managed = False
        db_table = 'emplacement'


J'ai un problème avec la table Emplacement, lorsque j'affiche les données des tables sur mes pages, les tables simples comme Salle et Materiel ne posent aucun soucis mais pour la table emplacement l'id_mat apparaît sous la forme Materiel object et le num_salle ne veut même pas s'afficher :

invalid literal for int() with base 10: 'S001'

alors que mon num_salle est déclaré en CHarfield et pas de problème pour l'afficher dans la table salle. Pareil dans l'interface admin de django.
Voici un screen pour vous montrer :

https://www.zupimages.net/viewer.php?id=14/23/jhab.png
https://www.zupimages.net/
A voir également:

8 réponses

Utilisateur anonyme
3 juin 2014 à 12:32
invalid literal for int() with base 10: 'S001'

Le message est clair, tu demandes de transformer la chaîne S001 en entier, ce qui est sommes toutes impossibles.
0
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023
Modifié par Ibilolz le 3/06/2014 à 13:02
J'ai jamais voulu la transformer en entier, je veux juste afficher mon champs. Comment je peux faire ? Voici mon template pour l'afficher :

<tr><th>Identifiant Matériel</th><th>Salle</th><th>Date de Placement</th></tr>
     {% for y in dispo %}
                <tr><td>{{ y.id_mat }}</td><td>{{ y.num_salle }}</td><td>{{ y.date}}</td></tr>  
            {% endfor %}
            </table>  </zed3>
0
Utilisateur anonyme
3 juin 2014 à 13:08
J'ai jamais voulu la transformer en entier

Alors c'est django, dans ce cas, montre le traceback complet, on peut pas deviner...

num_salle, je pense devrait être un IntegerField
0
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023
3 juin 2014 à 13:12
Si je le mets en IntegerField Je ne peux plus appeler mes salles S001, S002 et c'est une de mes contraintes .
0
Utilisateur anonyme
3 juin 2014 à 13:58
Alors il faut que tu décortiques ce résultat

>>> s = 'S001'
>>> s.strip('S')
'001'
>>> int(s.strip('S'))
1


Mais dans tous les cas, tu dois te retrouver avec un entier à afficher apparemment...
0
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023
3 juin 2014 à 14:09
Et je peux faire quoi avec ça ? afficher la partie entière de ma chaîne ? ça va pas faire terrible
0
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023
3 juin 2014 à 14:32
Mais enfaîte j'ai pu afficher le num_salle en S001 dans la table salle (voir lien image), le problème est du aux liens entre les tables et je ne sais pas pourquoi.
0
Utilisateur anonyme
3 juin 2014 à 15:12
Non mais le problème est dans la récupération de la valeur dans ton template.

Pour cela, tu devrais créer une méthode dans ta classe Emplacement

class Emplacement(models.Model):
    id_empl = models.IntegerField(primary_key=True)
    id_mat = models.ForeignKey(Materiel, db_column='id_mat')
    date = models.DateField()
    num_salle = models.ForeignKey(Salle, db_column='num_salle')
    def getNum(self):
        return int(self.num_salle.strip('S'))
    class Meta:
        managed = False
        db_table = 'emplacement'


et modifier ton template pour accéder à cette valeur

<tr><th>Identifiant Matériel</th><th>Salle</th><th>Date de Placement</th></tr>
     {% for y in dispo %}
                <tr><td>{{ y.id_mat }}</td><td>{{ y.getNum() }}</td><td>{{ y.date}}</td></tr>  
            {% endfor %}
            </table>  </zed3>


Maintenant ne connaissant pas trop django, et ne pouvant tester, l'esprit est là...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023
Modifié par Ibilolz le 3/06/2014 à 16:14
Même erreur, voici le traceback :

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/inter1/inventaire/

Django Version: 1.6.4
Python Version: 2.7.3
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'inter1',
 'connec')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Template error:
In template /home/thomas/Documents/Dev/templates/inter1/Inventaire.html, error at line 35
   invalid literal for int() with base 10: 'S001'
   25 :             </table>  </zed2>


   26 : 


   27 : 


   28 : <h2> <strong><i>Disposition</i></strong> du matériel : </h2>


   29 : <span onclick="showHide(this, document.getElementById('spoiler3'));">Afficher</h2></span><br>


   30 : <zed3 id="spoiler3" style="display:none;">


   31 :            


   32 :  <table style="width:100%; border-spacing:0;">


   33 : 	        <tr><th>Identifiant Matériel</th><th>Salle</th><th>Date de Placement</th></tr>


   34 : 	    {% for y in dispo %}


   35 :                 <tr><td>{{ y.id_mat }}</td><td> {{ y.num_salle }} </td><td>{{ y.date}}</td></tr>		


   36 :             {% endfor %}


   37 :             </table>  </zed3>


   38 : 


   39 : 


   40 : {% endblock %}


   41 : 


   42 : 


   43 :  


   44 : 


   45 : 

Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/thomas/Documents/Dev/inter1/views.py" in inventaire
  34.   return render(request, 'inter1/Inventaire.html', locals())
File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py" in render
  53.     return HttpResponse(loader.render_to_string(*args, **kwargs),
File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py" in render_to_string
  169.         return t.render(context_instance)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py" in render
  196.                         nodelist.append(node.render(context))
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render
  88.             output = self.filter_expression.resolve(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in resolve
  585.                 obj = self.var.resolve(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in resolve
  735.             value = self._resolve_lookup(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _resolve_lookup
  771.                         current = getattr(current, bit)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py" in __get__
  316.                     qs = qs.filter(**params)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in filter
  590.         return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in _filter_or_exclude
  608.             clone.query.add_q(Q(*args, **kwargs))
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py" in add_q
  1198.         clause = self._add_q(where_part, used_aliases)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py" in _add_q
  1234.                     current_negated=current_negated)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py" in build_filter
  1125.         clause.add(constraint, AND)
File "/usr/local/lib/python2.7/dist-packages/django/utils/tree.py" in add
  104.         data = self._prepare_data(data)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/where.py" in _prepare_data
  79.             value = obj.prepare(lookup_type, value)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/where.py" in prepare
  352.             return self.field.get_prep_lookup(lookup_type, value)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py" in get_prep_lookup
  1085.         return super(IntegerField, self).get_prep_lookup(lookup_type, value)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py" in get_prep_lookup
  369.             return self.get_prep_value(value)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py" in get_prep_value
  1079.         return int(value)

Exception Type: ValueError at /inter1/inventaire/
Exception Value: invalid literal for int() with base 10: 'S001'
0
Utilisateur anonyme
3 juin 2014 à 16:05
C'est que l'erreur ne vient pas de là... Peux-tu montrer le traceback complet comme demander déjà bien plutôt, en indiquant la ligne où se trouve l'erreur ?
0
Utilisateur anonyme
3 juin 2014 à 17:31
Ton erreur se trouve apparemment dans la fonction get_prep_value...

Modifie là pour

def get_prep_value(self, value):
    return value
0
Ibilolz Messages postés 130 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023
4 juin 2014 à 10:00
cela n'a rien changé.
0

Discussions similaires