avoir une classe de formulaire en ligne: classe inline: p> classe d'administration p> question: strong> Comment obtenir un objet actuel dans itemColorselectform code>. p>
Imprimer kwargs code> retour: p>
3 Réponses :
Solution: strong>
Remplacement de la méthode de format dans la classe inline
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 code>
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> comme de 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'])
solution de solution d'Arti, une autre meilleure option pourrait être: p> au lieu de passer l'ID d'objet actuel dans la forme en ligne, donc, il n'est pas nécessaire de remplacer le fonctionne dans django 2.1.7 em> p> p>
Utilisez l'ID d'objet pour créer un champ de formulaire en ligne dans le get_formset (). P>
blockQquote> __ init __ () code> dans le formulaire, ni l'objet actuel . p>