8
votes

Django Obtenir une instance dans le formulaire inline admin

avoir une classe de formulaire en ligne: xxx

classe inline: xxx

classe d'administration xxx

question: Comment obtenir un objet actuel dans itemColorselectform .

Imprimer kwargs retour: xxx


0 commentaires

3 Réponses :


3
votes

Solution: Remplacement de la méthode de format dans la classe inline xxx


4 commentaires

Si vous exécutez en mode multi-threadé, vous risquez d'avoir des problèmes car inineform.obj est partagé entre des threads. La valeur pourrait donc changer entre le réglage et l'obtenir.


Cela dit, il ne semble pas que Django nous donne un choix, et il n'y a probablement pas beaucoup d'utilisateurs de l'administrateur à tout moment, lisez-la donc comme «vous ne devriez réellement pas faire cela, mais je vais utiliser C'est moi-même en ce moment ".


Une solution horrible qui va casser lors de la course multi-filetée, par exemple en utilisant UWSGI.


Pourquoi assigner à la classe lorsque vous pouvez attribuer à l'instance? self.instance = obj



6
votes

Solution actuellement acceptée n'est pas le fil de sécurité fort>. Si vous vous souciez de la sécurité du fil, jamais, n'attribuez jamais une instance à une propriété de classe statique.

Les solutions de sécurité de thread sont les suivantes: p>

pour Django 1.7 (versions éventuellement antérieures , incertain): p> xxx pré>

comme de django> = 1.9 fort> il est également possible de passer form_kwargs: p> xxx pré >

ci-dessus Solutions fera une instance KWARG disponible dans le formulaire de modèle: P>

class InlineForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(InlineForm, self).__init__(*args, **kwargs)
        print('instance', kwargs['instance'])


0 commentaires

1
votes

à corriger: solution actuellement acceptée non sûre en mode multi-thread

solution de solution d'Arti, une autre meilleure option pourrait être:

au lieu de passer l'ID d'objet actuel dans la forme en ligne,
Utilisez l'ID d'objet pour créer un champ de formulaire en ligne dans le get_formset (). xxx xxx

donc, il n'est pas nécessaire de remplacer le __ init __ () dans le formulaire, ni l'objet actuel .

fonctionne dans django 2.1.7


0 commentaires