Bonjour tout le monde,
Je suis entrain de développer mon application web depuis maintenant près de 6 mois et je rencontre un problème pour pré-remplir un de me formulaires avec les données provenant d'un autre modèle.
Je possède plusieurs tables et ici sont mises en jeu 2 tables : Person et BirthCertificate.
La table Person permet de créer toute une fiche d'information sur un individu (nom, prénom, date de naissance, adresse, ... et un numéro unique)
La table BirthCertificate doit pouvoir lire le numéro unique écrit par l'utilisateur et pré-remplir le formulaire avec les données contenues dans la table Person pour le numéro unique donné.
Donc voici mes modèles Person et BirthCertificate :
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 class Person(models.Model): social_number = models.CharField(max_length=30, null=True, verbose_name='numero social', unique=True) title = models.CharField(max_length=12,choices=TITLE_CHOICES, verbose_name='Civilité') young_girl_lastname = models.CharField(max_length=30, verbose_name='Nom de jeune fille', blank=True) lastname = models.CharField(max_length=30, verbose_name='Nom de famille') firstname = models.CharField(max_length=30, verbose_name='Prénom(s)') sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe') status = models.CharField(max_length=15, choices=STATUS_CHOICES, verbose_name="Statut civil") birthday = models.DateField(verbose_name='Date de naissance') birthcity = models.CharField(max_length=30, verbose_name='Ville de naissance') birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance') birthmairie = models.CharField(max_length=30, verbose_name='Mairie de naissance') nationality = models.CharField(max_length=30, verbose_name='Nationalité') job = models.CharField(max_length=30, verbose_name='Profession') adress = models.CharField(max_length=30, verbose_name='Adresse') city = models.CharField(max_length=30, verbose_name='Ville') zip = models.IntegerField(verbose_name='Code Postal') country = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays') mail = models.CharField(max_length=30, verbose_name='Email', blank=True) phone = models.CharField(max_length=20, verbose_name='Téléphone', blank=True) created = models.DateTimeField(auto_now_add=True) mairie = models.CharField(max_length=30, null=False, verbose_name='Mairie', default=' ')
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class BirthCertificate(models.Model): lastname = models.CharField(max_length=30, null=False, verbose_name='Nom de famille') firstname = models.CharField(max_length=30, null=False, verbose_name='Prénom(s)') sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe') birthday = models.DateField(null=False, verbose_name='Date de naissance') birthhour = models.TimeField(null=True, verbose_name='Heure de naissance') birthcity = models.CharField(max_length=30, null=False, verbose_name='Ville de naissance') birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance') fk_parent1 = models.ForeignKey(Person, related_name='ID_Parent1', verbose_name='ID parent1', null=False) fk_parent2 = models.ForeignKey(Person, related_name='ID_Parent2', verbose_name='ID parent2', null=False) mairie = models.CharField(max_length=30, null=False, verbose_name='Mairie') social_number = models.CharField(max_length=30, null=True, verbose_name='numero social', unique=True) created = models.DateTimeField(auto_now_add=True)
Voici également mon fichier forms de l'application BirthCertificate :
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 class CustomLabelModelChoiceField(forms.ModelChoiceField): def __init__(self, *args, **kwargs): self._label_from_instance = kwargs.pop('label_func', force_text) super(CustomLabelModelChoiceField, self).__init__(*args, **kwargs) def label_from_instance(self, obj): return self._label_from_instance(obj) class BirthCertificateForm2(forms.ModelForm): fk_parent1 = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Père", label_func=lambda obj: '%s %s %s' % (obj.lastname, obj.firstname, obj.social_number), empty_label=None) fk_parent2 = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Mère", label_func=lambda obj: '%s %s %s' % (obj.lastname, obj.firstname, obj.social_number), empty_label=None) lastname = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Nom", label_func=lambda obj: '%s' % (obj.lastname), empty_label=None) firstname = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Prénom", label_func=lambda obj: '%s' % (obj.firstname), empty_label=None) birthday = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Date de Naissance", label_func=lambda obj: '%s' % (obj.birthday), empty_label=None) birthcity = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Ville de Naissance", label_func=lambda obj: '%s' % (obj.birthcity), empty_label=None) sex = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Sexe", label_func=lambda obj: '%s' % (obj.sex), empty_label=None) birthcountry = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Pays de Naissance", label_func=lambda obj: '%s' % (obj.birthcountry), empty_label=None) mairie = forms.CharField(widget=forms.HiddenInput(), initial=Mairie.objects.get(id=1).city.encode('utf-8')) social_number = CustomLabelModelChoiceField(Person.objects.filter(),required=False, label = "Numéro Unique", label_func=lambda obj: '%s' % (obj.social_number), empty_label=None) class Meta : model = BirthCertificate fields = ['lastname', 'firstname', 'sex', 'birthday', 'birthhour', 'birthcity', 'birthcountry','fk_parent1', 'fk_parent2', 'mairie', 'social_number'] widgets = {'country': CountrySelectWidget()} def __init__(self, *args, **kwargs): super(BirthCertificateForm2, self).__init__(*args, **kwargs) for key, value in self.fields.iteritems() : self.fields[key].widget.attrs.update({'class':'form-fields'}) class IdentityForm(forms.ModelForm) : class Meta : model = Person fields = ['title', 'lastname', 'firstname', 'sex', 'birthday', 'birthcity', 'birthcountry', 'nationality', 'job', 'adress', 'city', 'zip', 'country', 'mail', 'phone'] widgets = {'country': CountrySelectWidget()}
Puis ma fonction dans ma vue :
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 @login_required def BirthCertificate_Form_unique_number(request) : #User fill some fields query_social_number = request.GET.get('social_number') query_social_number_father = request.GET.get('social_number_father') query_social_number_mother = request.GET.get('social_number_mother') if request.method == 'POST': form = BirthCertificateForm2(request.POST or None) if form.is_valid() : # Vérification sur la validité des données post = form.save() return HttpResponseRedirect(reverse('BC_treated2', kwargs={'id': post.id})) else: form = BirthCertificateForm2() parent1 = Person.objects.filter(social_number=query_social_number_father) parent2 = Person.objects.filter(social_number=query_social_number_mother) individu = Person.objects.filter(social_number = query_social_number) form.fields['fk_parent1'].queryset = parent1 form.fields['fk_parent2'].queryset = parent2 form.fields['lastname'].queryset = individu form.fields['firstname'].queryset = individu form.fields['birthday'].queryset = individu form.fields['birthcity'].queryset = individu form.fields['birthcountry'].queryset = individu form.fields['sex'].queryset = individu form.fields['social_number'].queryset = individu print request.POST context = { "form" : form, "individu": individu, } return render(request, 'BC_form2.html', context)
Et mon template HTML :
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 {% extends 'Base_BirthCertificate_Naissance.html' %} {% load staticfiles %} {% block title %} <h3> <span class="glyphicon glyphicon-file"></span>Acte de Naissance à partir d'un numéro unique</align> </h3> {% endblock %} {% block content %} <style> form > input { width:20%; } form { list-style: none; } </style> <!-- ############### --> <!-- Page principale --> <!-- ############### --> <form class = "form" method="GET" action=""> <h4> Numéro unique de l'individu : </h4> <input type="text" name="social_number" placeholder="N° unique de l'individu" value="{{request.GET.social_number}}"> <h4> Nom de famille du père et de la mère : </h4> <input type="text" name="social_number_father" placeholder="N° unique du père" value="{{ request.GET.social_number_father }}"> <input type="text" name="social_number_mother" placeholder="N° unique de la mère" value="{{ request.GET.social_number_mother }}"> <input class="button" type="submit" value="Valider"> <br></br> </form> <form class = "form" method='POST' action=''> {% csrf_token %} <br></br> {{ form.as_p}} <!-- Display child part formulary --> <br></br> <input class="button" type ="submit" value="Valider l'acte de naissance" /> </form> {% endblock content %}
Lorsque j'exécute ma vue, le print request.POST me renvoie <QueryDict: {}>
De plus, j'obtiens l'erreur suivante :
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 Environment: Request Method: POST Request URL: http://localhost:8000/BirthCertificate/formulaire2?social_number=1+87+10+STRASBOURG+-+583403&social_number_father=1+87+10+STRASBOURG+-+583403&social_number_mother=2+08+12+STRASBOURG+-+039838 Django Version: 1.10.3 Python Version: 2.7.12 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'BirthCertificate', 'Identity', 'bootstrapform', 'Accueil', 'django_countries', 'log', 'Mairie', 'Table', 'Recensement', 'Configurations', 'debug_toolbar', 'chartit', 'Mariage'] Installed Middleware: ['django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.gzip.GZipMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'debug_toolbar.middleware.DebugToolbarMiddleware'] Traceback: File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 39. response = get_response(request) File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _legacy_get_response 249. response = self._get_response(request) File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 187. response = self.process_exception_by_middleware(e, request) File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 23. return view_func(request, *args, **kwargs) File "/Users/valentinjungbluth/Desktop/Django/Etat_civil/BirthCertificate/views.py" in BirthCertificate_Form_unique_number 82. if form.is_valid() : # Vérification sur la validité des données File "/usr/local/lib/python2.7/site-packages/django/forms/forms.py" in is_valid 169. return self.is_bound and not self.errors File "/usr/local/lib/python2.7/site-packages/django/forms/forms.py" in errors 161. self.full_clean() File "/usr/local/lib/python2.7/site-packages/django/forms/forms.py" in full_clean 372. self._post_clean() File "/usr/local/lib/python2.7/site-packages/django/forms/models.py" in _post_clean 398. self.instance.full_clean(exclude=exclude, validate_unique=False) File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in full_clean 1210. self.clean_fields(exclude=exclude) File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in clean_fields 1252. setattr(self, f.attname, f.clean(raw_value, self)) File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in clean 590. value = self.to_python(value) File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in to_python 1237. parsed = parse_date(value) File "/usr/local/lib/python2.7/site-packages/django/utils/dateparse.py" in parse_date 60. match = date_re.match(value) Exception Type: TypeError at /BirthCertificate/formulaire2 Exception Value: expected string or buffer
Je ne trouve pas l'erreur depuis 2 jours si quelqu'un aurait une idée ?
Partager