Je rencontre un petit problème entre les modèles et les formulaires dans mon projet Django. J'ai créé une nouvelle application: Divorce
Django: tous les arguments ne sont pas convertis lors de la mise en forme des chaînes
Mon models.py fichier ressemble:
#-*- coding: utf-8 -*-
from django.db import models
from Identity.models import Person
from Mariage.models import Acte_Mariage
from django.utils.encoding import force_text
from django_countries.fields import CountryField
class Acte_Divorce(models.Model):
fk_epoux = models.ForeignKey(Person, related_name='EpouxDivorce', verbose_name='Epoux', null=False)
fk_epouse = models.ForeignKey(Person, related_name='EpouseDivorce', verbose_name='Epouse', null=False)
fk_temoin1 = models.ForeignKey(Person, related_name='Temoin 1 Divorce+', verbose_name='Temoin 1', null=True)
fk_temoin2 = models.ForeignKey(Person, related_name='Temoin 2 Divorce+', verbose_name='Temoin 2', null=True)
fk_temoin3 = models.ForeignKey(Person, related_name='Temoin 3 Divorce+', verbose_name='Temoin 3', null=True)
fk_temoin4 = models.ForeignKey(Person, related_name='Temoin 4 Divorce+', verbose_name='Temoin 4', null=True)
mairie = models.CharField(max_length=30, null=False, verbose_name='Mairie', default=' ')
fk_mariage = models.ForeignKey(Acte_Mariage, related_name='ID', verbose_name="ID", null=False, default= '0')
divorce_date = models.DateField(null=True, blank=True, verbose_name='Date du mariage (optionnel)')
divorce_heure = models.TimeField(null=True, blank=True, verbose_name='Heure du mariage (optionnel)')
created = models.DateTimeField(auto_now_add=True)
utilisateur = models.CharField(max_length=100, null=False, verbose_name="utilisateur", default=" ")
Comme vous pouvez le voir, j'ai deux champs avec deux FOREIGN_KEY différentes: la première pointe vers Person model
et le second à Acte_Mariage model
.
Maintenant, j'ai dans ma demande de divorce d'un fichier forms.py:
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 Acte_Divorce_Form(forms.ModelForm):
fk_epoux = CustomLabelModelChoiceField(Person.objects.filter(sex = "Masculin"), required=False, label = "Epoux", label_func=lambda obj: '%s %s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity, obj.social_number), empty_label=None)
fk_epouse = CustomLabelModelChoiceField(Person.objects.filter(sex = "Feminin"), required=False, label = "Epouse", label_func=lambda obj: '%s %s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity, obj.social_number), empty_label=None)
fk_mariage = CustomLabelModelChoiceField(Acte_Mariage.objects.filter(), label="N° Acte Mariage", label_func=lambda obj: '%s %s %s' % (obj.id, obj.fk_epoux, obj.fk_epouse))
fk_temoin1 = CustomLabelModelChoiceField(Person.objects.filter(Q(sex='Masculin') | Q(sex='Feminin')), required=False, label = "Témoin 1", label_func=lambda obj: '%s %s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity, obj.social_number), empty_label=None)
fk_temoin2 = CustomLabelModelChoiceField(Person.objects.filter(Q(sex='Masculin') | Q(sex='Feminin')), required=False, label = "Témoin 2", label_func=lambda obj: '%s %s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity, obj.social_number), empty_label=None)
fk_temoin3 = CustomLabelModelChoiceField(Person.objects.filter(Q(sex='Masculin') | Q(sex='Feminin')), required=False, label = "Témoin 3", label_func=lambda obj: '%s %s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity, obj.social_number), empty_label=None)
fk_temoin4 = CustomLabelModelChoiceField(Person.objects.filter(Q(sex='Masculin') | Q(sex='Feminin')), required=False, label = "Témoin 4", label_func=lambda obj: '%s %s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity, obj.social_number), empty_label=None)
mairie = forms.CharField(widget=forms.HiddenInput(), initial=Mairie.objects.using('default').last().city.encode('utf-8'))
utilisateur = forms.CharField(widget=forms.HiddenInput())
class Meta :
model = Acte_Divorce
fields = ['fk_epoux', 'fk_epouse', 'fk_mariage', 'fk_temoin1', 'fk_temoin2', 'fk_temoin3', 'fk_temoin4', 'divorce_date', 'divorce_heure', 'mairie', 'utilisateur']
widgets = {'country': CountrySelectWidget()}
def __init__(self, *args, **kwargs):
super(Acte_Divorce_Form, self).__init__(*args, **kwargs)
for key, value in self.fields.iteritems() :
self.fields[key].widget.attrs.update({'class':'form-fields'})
En class Acte_Divorce_Form(forms.ModelForm)
, je fk_mariage
avec une fonction d'étiquette.
Si je vous écris:
fk_mariage = CustomLabelModelChoiceField(Acte_Mariage.objects.filter(), label="N° Acte Mariage", label_func=lambda obj: '%s' % (obj.id))
Il fonctionne, mais je veux afficher deux champs:
fk_mariage = CustomLabelModelChoiceField(Acte_Mariage.objects.filter(), label="N° Acte Mariage", label_func=lambda obj: '%s %s %s' % (obj.id, obj.fk_epoux, obj.fk_epouse))
Et maintenant, je reçois cette erreur: not all arguments converted during string formatting
par qui expression Je dois remplacer %s
pour obj.fk_epoux
et obj.fk_epouse
? Les deux champs me donne un nombre.
Merci
EDIT:
Mon modèle de l'application Mariage:
class Acte_Mariage(models.Model):
fk_epoux = models.ForeignKey(Person, related_name='Epoux', verbose_name='Epoux', null=False)
fk_epouse = models.ForeignKey(Person, related_name='Epouse', verbose_name='Epouse', null=False)
fk_father_husband = models.ForeignKey(Person, related_name='Pere Epoux+', verbose_name='Pere Epoux', null=False)
fk_mother_husband = models.ForeignKey(Person, related_name='Mere Epoux+', verbose_name='Mere Epoux', null=False)
fk_father_wife = models.ForeignKey(Person, related_name='Pere Epouse+', verbose_name='Pere Epouse', null=False)
fk_mother_wife = models.ForeignKey(Person, related_name='Mere Epouse+', verbose_name='Mere Epouse', null=False)
fk_temoin1 = models.ForeignKey(Person, related_name='Temoin 1+', verbose_name='Temoin 1', null=True)
fk_temoin2 = models.ForeignKey(Person, related_name='Temoin 2+', verbose_name='Temoin 2', null=True)
fk_temoin3 = models.ForeignKey(Person, related_name='Temoin 3+', verbose_name='Temoin 3', null=True)
fk_temoin4 = models.ForeignKey(Person, related_name='Temoin 4+', verbose_name='Temoin 4', null=True)
mairie = models.CharField(max_length=30, null=False, verbose_name='Mairie', default=' ')
mariage_date = models.DateField(null=True, blank=True, verbose_name='Date du mariage (optionnel)')
mariage_heure = models.TimeField(null=True, blank=True, verbose_name='Heure du mariage (optionnel)')
created = models.DateTimeField(auto_now_add=True)
utilisateur = models.CharField(max_length=100, null=False, verbose_name="utilisateur", default=" ")
Votre modèle ne permet pas le mariage entre personnes du même sexe? – MichielB
S'il vous plaît partager votre modèle 'Acte_Mariage' –
@MichielB Pas pour l'instant car le pays où ce projet sera installé ne permet pas le mariage homosexuel. Il pourrait être une prochaine mise à jour;) – Deadpool