2017-10-18 3 views
0

J'ai besoin de votre aide pour savoir comment je peux actualiser mon Django template de get_context_data.Comment actualiser le modèle Django avec get_context_data

J'ai cette classe à mon avis:

class IdentitySocieteResumeView(LoginRequiredMixin,TemplateView) : 

    template_name = 'Identity_Societe_Resume.html' 
    model = Societe 

    def get_context_data(self, **kwargs) : 

     context_data = super(IdentitySocieteResumeView, self).get_context_data(**kwargs) 

     id = self.kwargs['id'] 
     societe = get_object_or_404(Societe, pk=id) 

     obj = Societe.objects.filter(Nom=societe.Nom, SIRET=societe.SIRET, SIREN=societe.SIREN, Ville=societe.Ville) 

     if obj: 
      sc_obj = obj[0] 

      NIU = lib.Individu_Recherche.NIUGeneratorSociete(ModelBase=societe) 

      societe.NumeroIdentification = NIU 
      societe.save() 

      context_data['queryset'] = obj 

     return context_data 

Et cette fonction importante dans lib.Individu_Recherche:

def NIUGeneratorSociete(ModelBase) : 

    create_year_temp = str(ModelBase.Creation.year) 
    create_year_temp2 = str(create_year_temp.split(" ")) 
    create_year = create_year_temp2[4] + create_year_temp2[5] 

    ''' A process which let to generate NumeroIdentification ''' 

    NumeroIdentification = force_text('%s-%s%s-%s-%s-%s' % ('E', create_year, create_month, create_city, key, create_country_id)) 

    return NumeroIdentification 

Une partie de mon modèle:

{% block content %} 

    <div class="title_subtitle_space"></div> 

    <div class="resume"> 

    {% for societe in queryset %} 

     Votre société porte le numéro : <b> {{ societe.id}} </b> <p></p> 
     N° identification attribué : <b>{{societe.NumeroIdentification}}</b> <br></br> 

    {% endfor %} 
{% endblock %} 

Je suis sûr que mon le modèle est chargé avant d'exécuter cette fonction et je reçois dans mon modèle NumeroIdentification = None b ut dans ma base de données ce champ est bien rempli.

Ma question est: Comment je peux afficher ma NumeroIdentification variable avec la bonne valeur dans mon modèle (valeur stockée dans ma base de données) au lieu de None? Si j'appuie sur Cmd + R (Actualiser MacOS), NumeroIdentification ne sera pas None mais une valeur différente. Je voudrais obtenir cette valeur dans mon modèle la première fois.

Il est assez facile avec FBV, mais avec CBV je ne surmontent pas faire

EDIT:

ajouter ma fonction NIUGeneratorSociete:

def NIUGeneratorSociete(ModelBase) : 

    create_year_temp = str(ModelBase.Creation.year) 
    create_year_temp2 = str(create_year_temp.split(" ")) 
    create_year = create_year_temp2[4] + create_year_temp2[5] 

    create_month_temp = ModelBase.Creation.month 
    if len(str(create_month_temp)) == 1 : 
     create_month = '0' + str(create_month_temp) 
    else : 
     create_month = create_month_temp 

    create_city = Villes[ModelBase.Ville] 

    key_temp = randint(0,999999) 
    if len(str(key_temp)) == 1 : 
     key = '00000' + str(key_temp) 
    elif len(str(key_temp)) == 2 : 
     key = '0000' + str(key_temp) 
    elif len(str(key_temp)) == 3 : 
     key = '000' + str(key_temp) 
    elif len(str(key_temp)) == 4 : 
     key = '00' + str(key_temp) 
    elif len(str(key_temp)) == 5 : 
     key = '0' + str(key_temp) 
    else : 
     key = key_temp 

    create_country = ModelBase.Pays 
    create_country_id = None   
    if create_country == "CG" : 
     create_country_id = 1 
    else : 
     create_country_id = 2 

    NumeroIdentification = force_text('%s-%s%s-%s-%s-%s' % ('E', create_year, create_month, create_city, key, create_country_id)) 

    return NumeroIdentification 

Répondre

1

Malheureusement, ce code est confus. Vous obtenez le même objet de plusieurs manières différentes, et en mettant à jour une copie en attendant que les autres reflètent le changement.

Vous obtenez d'abord l'objet pertinent en tant que societe. Ensuite, pour une raison quelconque, vous faites une autre requête sur ce modèle avec tous les champs de cet objet, pour obtenir un ensemble de requêtes constitué d'un objet. Ensuite, vous faites une manipulation de l'objet original et l'enregistrez, mais ne le transmettez pas au contexte; Au lieu de cela, vous passez le jeu de requête.

Votre code peut être simplifié à ceci:

def get_context_data(self, **kwargs) : 

    context_data = super(IdentitySocieteResumeView, self).get_context_data(**kwargs) 

    id = self.kwargs['id'] 
    societe = get_object_or_404(Societe, pk=id) 

    NIU = lib.Individu_Recherche.NIUGeneratorSociete(societe) 
    societe.NumeroIdentification = NIU 
    societe.save() 

    context_data['societe'] = societe 

    return context_data 

et le modèle:

{% block content %} 
<div class="title_subtitle_space"></div> 

    <div class="resume"> 

     Votre société porte le numéro : <b> {{ societe.id}} </b> <p></p> 
     N° identification attribué : <b>{{societe.NumeroIdentification}}</b> <br></br> 

    </div> 
</div> 
{% endblock %} 

Il y a aussi des choses étranges se passent dans votre fonction de bibliothèque. l'un est que vous passez l'objet en tant que paramètre ModelBase; Bien que cela n'a pas d'importance, ModelBase est une classe, mais votre paramètre est une instance de votre classe Societe. Vous devriez appeler les choses ce qu'elles sont.

Je ne peux pas corriger cette fonction car elle est clairement incomplète; tous les numéros create_month, create_city, key, create_country_id sont indéfinis. Enfin, vous devriez considérer si l'un de ces éléments est approprié. La fonction de mise à jour est appelée depuis get_context_data dans une requête GET normale de votre page; il serait très surprenant qu'un objet soit mis à jour comme ça sur un GET. Vraiment, cela devrait être fait sur un POST seulement.

+0

Merci pour votre réponse. Je comprends toutes mes choses étranges. Je dois changer 'get_context_data()' par 'post()' afin de mettre à jour mon objet et afficher cet objet mis à jour dans mon modèle? – Deadpool

1

Beaucoup de choses étranges passe ici. Après societe = get_object_or_404(Societe, pk=id), vous aurez une instance Société (ou 404). Vous filtrez ensuite Société pour obtenir une liste d'objets qui ont les mêmes propriétés à l'instance que vous avez déjà reçue, puis récupérez le premier de ceux-ci. Pourquoi ne pas simplement obj = get_object_or_404(Societe, pk=id) et passer le reste? Vous mélangez ensuite obj, societe et sc_obj. Vos actions sur l'un d'eux seront perdues sur les autres jusqu'à ce que vous les récupériez, ce qui explique probablement pourquoi cela fonctionne à l'actualisation. Peut-être utile de voir votre modèle Societe pour confirmer si.

+0

Vous avez raison. Je comprends votre réponse et je ne sais pas pourquoi j'ai fait ces lignes bizarres. – Deadpool