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}}">&nbsp;
 
                <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 }}">&nbsp;
                <input type="text"  name="social_number_mother" placeholder="N° unique de la mère" value="{{ request.GET.social_number_mother }}">&nbsp;
                <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 ?