1

I use ModelChoiceField with initial value just for display (readonly field).

But value displayed is model id and I want to display customized value that will be a concatenation of 3 fields. I've override ____str____ method but it is not applyed.

I try to make customize ModelChoiceFiedl to define label_from_instance that seems to be the way to do what I want but it is not applyed...

models.py

class Utilisateur(SafeDeleteModel):

    _safedelete_policy = SOFT_DELETE_CASCADE
    uti_ide = models.AutoField(primary_key = True)
    # pro_ide = models.ForeignKey(Projet, on_delete = models.CASCADE) # related project
    projets = models.ManyToManyField(Projet, through='UtilisateurProjet')
    uti_nom = models.CharField("Nom", max_length=20)
    uti_pre = models.CharField("Prénom", max_length=20)
    uti_mai = models.CharField("Email", max_length=40)
    uti_sit = models.CharField("Equipe", max_length=20, null=True, blank=True)
    uti_pro = models.CharField("Fonction/profil", max_length=200, null=True, blank=True)
    uti_log = models.CharField("Log utilisateur", max_length=20, null=True, blank=True)
    uti_dat = models.DateTimeField("Date log",auto_now_add=True, null=True, blank=True)
    log = HistoricalRecords()

    @classmethod
    def options_list(cls,pro_ide):

        # projet = Projet.objects.get(pro_ide=pro_ide)
        # utilisateurs = Utilisateur.objects.filter(pro_ide=projet.pro_ide)
        utilisateurs = Utilisateur.objects.filter(projets__pro_ide=pro_ide)
        the_opts_list = [(utilisateur.uti_ide, utilisateur.uti_nom+', '+utilisateur.uti_pre) for utilisateur in utilisateurs]
        the_opts_list.insert(0, (None, ''))
        return the_opts_list

    class Meta:

        db_table = 'tbl_uti'
        verbose_name_plural = 'Utilisateurs'
        ordering = ['uti_ide']

    def __str__(self):

        return f"{self.uti_nom}, {self.uti_pre} ({self.uti_mai})"

forms.py

class UtilisateurModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        print('label')
        return obj.uti_nom+', '+obj.uti_pre+' ('+obj.uti_mai+')'


class UtilisateurProjetUpdateForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request") 
        super(UtilisateurProjetUpdateForm, self).__init__(*args, **kwargs)
        # print('kwargs',self.request)
        # print('projet',self.request['projet'])
        # print('utilisateur',self.request['utilisateur'])

        PROJETS = Projet.objects.all()
        UTILISATEURS = Utilisateur.objects.all()
        self.fields["pro_ide"] = forms.ModelChoiceField(queryset = PROJETS, label = "Nom projet", widget = forms.HiddenInput(), initial = Projet.objects.get(pro_ide=self.request['projet']))
        self.fields["uti_ide"] = UtilisateurModelChoiceField(queryset = UTILISATEURS, label = "Nom, prénom de l'utilisateur", widget = forms.TextInput(attrs={'readonly':'readonly'}), initial = Utilisateur.objects.get(uti_ide=self.request['utilisateur']),) #,to_field_name="uti_nom"

    class Meta:
        model = UtilisateurProjet
        fields = ('pro_ide','uti_ide',)
SLATER
  • 613
  • 9
  • 31

1 Answers1

0

in forms.py under that last class Meta: you need to add:

field_classes = {
    'pro_ide': UtilisateurModelChoiceField,
    'uti_ide': UtilisateurModelChoiceField,
}