Supprimer des champs de ModelForm
j'ai un simple ModelForm:
class MyForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
del self.fields['name']
Comme vous pouvez le voir, j'essaie de supprimer un champ de la forme de la liste de champ (le champ définitivement existe dans le modèle), mais j'obtiens une Exception:
TemplateSyntaxError at [..]
Caught an exception while rendering: "Key 'name' not found in Form"
Je n'ai pas écrit un formulaire personnalisé, de sorte que le modèle où l'erreur se produit est:
/templates/admin/includes/fieldset.html, error at line 4
Des idées?
-- UPDATE --
Le problème n'apparait que dans la zone d'admin.
-- Mise à JOUR 2 --
Peut-être une trace de vidage donne plus d'infos:
Original Traceback (most recent call last):
File "/Library/Python/2.5/site-packages/django/template/debug.py", line 71, in render_node
result = node.render(context)
File "/Library/Python/2.5/site-packages/django/template/defaulttags.py", line 155, in render
nodelist.append(node.render(context))
File "/Library/Python/2.5/site-packages/django/template/defaulttags.py", line 239, in render
value = bool_expr.resolve(context, True)
File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 546, in resolve
obj = self.var.resolve(context)
File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 687, in resolve
value = self._resolve_lookup(context)
File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 722, in _resolve_lookup
current = current()
File "/Library/Python/2.5/site-packages/django/contrib/admin/helpers.py", line 81, in errors
return mark_safe(u'\n'.join([self.form[f].errors.as_ul() for f in self.fields]).strip('\n'))
File "/Library/Python/2.5/site-packages/django/forms/forms.py", line 105, in __getitem__
raise KeyError('Key %r not found in Form' % name)
KeyError: "Key 'name' not found in Form"
Dans la zone d'admin, j'utilise le Grapelli-Thème. Peut-être que cela a à voir avec le problème?
Comme par magie™ il fonctionne maintenant, bien que je ne sais pas pourquoi. Merci quand même pour votre aide.
OriginalL'auteur schneck | 2009-09-23
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. C'est la façon dont je l'ai fait travailler dans le nouveau Django (le tronc):
En remplaçant la
get_form
méthode et de mettre de la logique ici, vous pouvez choisirForm
vous souhaitez afficher. Ci-dessus j'affiche le formulaire standard lorsqu'une condition est remplie.MyModelAdmin
avecexclude = []
(ou quelle que soit la base exclut) et ensuite faireself.exclude.append('field')
lorsque les conditions sont remplies.Aussi juste une remarque (que je ne pouvais pas le modifier car il était trop petit):
user.is_staff
est une propriété qui n'est pas une méthode, afin de l'appelant qu'il va jeter une erreur.Est-ce "thread-safe"?
Ne devrait-elle pas être
obj=obj
que le deuxième argument de la super-classe de l'appel de méthode?OriginalL'auteur wunki
Comme décrit dans La création de formulaires à partir de modèles - en Sélectionnant les champs à utiliser, il y a trois façons:
editable=False
. Tous les formulaires créés à partir du modèle, d'exclure du champ.fields
attribut dans laMeta
intérieur de la classe pour inclure uniquement les champs que vous souhaitez.exclude
attribut dans laMeta
intérieure de la liste des champs que vous ne voulez pas.Donc, si votre modèle comporte des champs
field1
,field2
, etfield3
et vous ne voulez pasfield3
, technique n ° 2 devrait ressembler à ceci:Et technique n ° 3 devrait ressembler à ceci:
Que voulez-vous dire en supprimant les champs "dynamique"?
cela signifie, que les champs qui seront affichés (/validé/sauvé) sont déterminés au moment de l'exécution, et non pas au moment de la conception
Bon, de quoi êtes-vous en train d'essayer de faire que vous avez besoin de changer ce que les champs sont affichés au moment de l'exécution?
Dans mon projet, il y a un modèle contenant de nombreux domaines, et pour l'utilisateur, il est possible de sélectionner un sous-ensemble de champs dont il a besoin. Qui déjà fonctionne bien sauf le problème ennuyeux dans l'admin principal.
OriginalL'auteur Selene
Cela fonctionne très bien...
OriginalL'auteur oak
Une seule cause que je peux penser est que si votre ModelAdmin classe qui utilise votre formulaire personnalisé a des paramètres conflictuels. Par exemple, si vous avez aussi explicitement spécifié champ "nom", dans des "champs" ou "balises html fieldsets" de votre ModelAdmin.
OriginalL'auteur Botond Béres
Vous pouvez utiliser la propriété exclure pour supprimer des champs à partir d'un ModelForm
OriginalL'auteur M. Ryan