Bonjour à tous, je me suis mis à Django depuis 2 mois et je dois dire que j'en bave. Je ne trouve pas cela du tout intuitif même si je reconnais que pour certaines choses c'est -à peine- plus rapide que de tout coder en php/html

Aussi je vous explique où je galère:

- Lorsque j'entre une variable via un formulaire, elle n'apparait pas de suite dans la liste déroulante de la page suivante ? Il y a un retard !!

- J'utilise un formulaire et sur la page suivante, ce meme formulaire est en lecture seul pour confirmation, mais il ne m'autorise pas certains champ -Taille.taille et Operation.name car ils sont en 'unique=True' mais sur une autre table. (c'est comme-ci le formulaire voulait écrire dans la même table ?

- Je dois télécharger un fichier via une BDD, comment faire le lien ? Faut il passer par le fichier urls.py ?

Voici le code models.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Taille(models.Model):
    taille = models.IntegerField(max_length=10, blank=False)
    def __unicode__(self):  
		return str(self.taille)
 
 
class Operation(models.Model):	
    name = models.CharField(max_length=254, unique=True)    
    create_date = models.DateTimeField('date de creation', auto_now_add=True)
    def __unicode__(self):
		return self.name
 
    def was_published_recently(self):
		return self.create_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'create_date'
    was_published_recently.boolean = True
    was_published_recently.short_description ='Published recently'
    date_hierarchy = 'create_date'
 
class DescLivre(models.Model):
    taille = models.ForeignKey(Taille)
    editeur = models.TextField()
    collection = models.TextField()
    used = models.BooleanField(default=False)
    def __unicode__(self):
		return self.editeur
 
class livre(models.Model):
    ad_mail = models.EmailField()
    password = models.CharField(max_length=512, blank=True)
    resumer = models.TextField(blank=True)
    autre = models.TextField(blank=True)
    editeur = models.ForeignKey(DescLivre, related_name="editeur")
    colletion = models.ForeignKey(DescLivre, related_name="collection") 
    operation = models.ForeignKey(Operation)
    user = models.ForeignKey(User)
voici le code pour forms.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class OperationForm(forms.ModelForm):
	class Meta:
		model = Operation
		fields = ['name']
 
class LivreForm(forms.ModelForm):
	class Meta:
		model = Livre
		fields =  ['mmp', 'ad_mail', ]
 
class ListeOperationForm(forms.Form):	
	name = forms.CharField(widget=forms.Select(choices=Operation.objects.all().values_list('name','name')))
 
class TailleForm(forms.Form):
	taille = forms.CharField(widget=forms.Select(choices=Taille.objects.all().values_list('id','taille')))
 
#######################################################################		
# Recuperation des infos et affichage en lecture seule #
class ValiderLivreForm(forms.ModelForm):
	class Meta:
		model = Livre
		fields =  ['mmp', 'ad_mail']		
 
	# Permet la lecture seule des champs du formulaire
	def set_readonly(self):
		for key, field in self.fields.items():
			field.widget.attrs['readonly'] = True
 
class ValiderTailleForm(forms.ModelForm):
	class Meta:
		model = Taille
		fields = ['id']	
 
	# Permet la lecture seule des champs du formulaire
	def set_readonly(self):
		for key, field in self.fields.items():
			field.widget.attrs['readonly'] = True
 
	# Affichage en lecture seule du choix du menu déroulant #
	taille = forms.IntegerField(label="Taille")
 
class ValiderlisteOperationForm(forms.ModelForm):
	class Meta:
		model = Operation
		fields = ['name']	
 
 
	# Permet la lecture seule des champs du formulaire
	def set_readonly(self):
		for key, field in self.fields.items():
			field.widget.attrs['readonly'] = True
 
	# Affichage en lecture seule du choix du menu déroulant #
	name = forms.CharField(label="Operation")
Voici le fichier views.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
 
def logout(request):    
    return render(request, 'generation/logout.html', locals())
 
from generation.forms import LivreForm, TailleForm, ListeOperationForm, ValiderTailleForm, ValiderLivreForm, ValiderlisteOperationForm
 
def bouquin(request):
    if request.method == 'POST':      
 
        livre_form = LivreForm(request.POST)       
        taille_form = TailleForm(request.POST)
        listeoperation_form = ListeOperationForm(request.POST)
 
        Reponsetaille = request.POST.get('taille')
 
		#Si le formulaire est valide et que l'on appui sur -valider-, il est sauvegarder dans la bdd (et le fichier est cree) #
        if livre_form.is_valid() and 'valider' in request.POST:
 
            free_desclivre = Desclivre.objects.filter(used='0').filter(taille_id=Reponsetaille)                   
 
            if len(free_desclivre) < 2:
                return HttpResponse('Il n\'a plus rien.')
 
            desclivre_editeur = free_desclivre[0]
            desclivre_collection = free_desclivre[1]
 
            c_livre = Livre(
                ad_mail = livre_form.cleaned_data['ad_mail'],
                mmp = livre_form.cleaned_data['mmp'],
                resumer = desclivre_editeur,
                autre = desclivre_collection,
                operation = Operation.objects.get(name=request.POST.get("name")),
                user = request.user
            )
 
            c_id = add_create_code_barre(               
                ad_mail = livre_form.cleaned_data['ad_mail'],
                mmp = livre_form.cleaned_data['mmp'],
                resumer = desclivre_editeur,
                autre = desclivre_collection,
            )
 
            c_livre.save()
 
            desclivre_editeur = True
            desclivre_editeur.save()
            desclivre_collection = True
            desclivre_collection.save()
 
            #PERMET LA CREATION DE DOSSIER EN FONCTION DU NOM#
            dirname=request.POST.get("name")
            if not os.path.exists(os.path.join('/home/ab/projet/templates/archives/', dirname)):
                os.mkdir(os.path.join('/home/ab/projet/templates/archives/', dirname))  
            #en test
			Texte='OK'
            newfile='ab.txt'
 
            d=nouv_fichier(dirname, newfile, Texte)
            livre_form.save()
 
            return redirect('recuperation')
 
        elif livre_form.is_valid() and taillecle_form.is_valid() and listeoperation_form.is_valid() and 'editer' in request.POST:            
 
            livre_form = ValiderLivreForm(request.POST)
            taille_form = ValiderTailleForm(request.POST)
            listeoperation_form = ValiderlisteOperationForm(request.POST)
 
            livre_form.set_readonly()
            taille_form.set_readonly()
            listeoperation_form.set_readonly()
 
            return render(request, 'generation/validation_conf.html', {'livre_form' : livre_form, 'taillecle_form': taille_form, 'listeoperation_form':listeoperation_form })
 
    else:
        livre_form = LivreForm()
        taille_form = TailleForm()
        listeoperation_form = ListeOperationForm()
 
    return render(request, 'generation/ajout_Creer.html', {'livre_form' : livre_form, 'taille_form': taillecle_form, 'listeoperation_form':listeoperation_form})
 
 
from bouquin.models import DescLivre
def recuperation(request):   
    c = Livre.objects.all
    return render(request, 'generation/recuperation.html', {'recuperation': c})
#################################################################################################################################
 
 
 
################################-FONCTION PERMETTANT DE CREER UN FICHIER AVEC MARQUE DEDANS - HELLO-#############################
def add_create_code_barre(ad_mail, mmp, editeur, collection):
    """
        Formule de math
    """	
    return c
 
#PERMET D'AJOUTER UNE OPERATION'
def operation(request):
    if request.method == 'POST':
        operation_form = OperationForm(request.POST)       
        if operation_form.is_valid():  
            name = operation_form.cleaned_data['name']
            operation_form.save()
            return HttpResponseRedirect('bouquin')
    else:
            operation_form = OperationForm()
    return render(request, 'generation/operation.html', {'operation_form' : operation_form})
 
#####################################################################
#PAGE d'ACCUEIL.
def accueil(request):
	return render(request, 'generation/accueil.html', locals())
 
#En test pour inserer fichier dans dossier sans connaitre le nom su dossier avant#
def nouv_fichier(dirname, newfile, Texte):
    chemin=('/home/ab/projet/templates/archives/',dirname)
    chemin_bis=('chemin/',newfile)
    print chemin_bis
    with open(chemin_bis,'w', encoding='utf-8') as f: 
        myfile = File(f)
        myfile.write(Texte)
        return
Merci à vous