2009-09-23 14 views
8

Mam proste ModelForm:Usuń pola z ModelForm

class MyForm(ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     del self.fields['name'] 

Jak widać, staram się usunąć pole z listy pól tego formularza (pole definitywnie istnieje w modelu), ale pojawia się wyjątek:

TemplateSyntaxError at [..] 

Caught an exception while rendering: "Key 'name' not found in Form" 

nie pisałem niestandardowego formularza, więc szablon gdzie występuje błąd jest:

/templates/admin/includes/fieldset.html, error at line 4 

Jakieś pomysły?

- AKTUALIZACJA -

Problem pojawia się tylko w obszarze administracyjnym.

- UPDATE 2 -

Może zrzutu ślad daje więcej info:

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" 

W obszarze administracyjnym, używam Grapelli-theme. Może to ma związek z problemem?

+0

Magicznie ™ działa teraz, chociaż nie wiem dlaczego. Mimo to dzięki za pomoc. – schneck

Odpowiedz

0

Można użyć właściwości wykluczenia usunąć pola z ModelForm

exclude = ('field_name1', 'field_name2,) 
+1

Wiem, ale muszę dynamicznie usuwać pola. – schneck

0

Jedną z przyczyn mogę pomyśleć, to jeśli klasa ModelAdmin który wykorzystuje niestandardowy formularz ma sprzecznych ustawienia. Na przykład, jeśli w polu "pola" lub "zestawy pól" swojego ModelAdmin wyraźnie określono również pole "nazwa".

+0

Nie, miałem głębsze spojrzenie w kodzie, nie ma żadnych twardych odniesień w ten sposób. – schneck

6

Jak opisano w Creating forms from models - Selecting the fields to use, istnieją trzy sposoby:

  1. W modelu, zestaw editable=False. Wszystkie formularze utworzone z modelu będą wykluczać pole.
  2. Zdefiniuj atrybut fields w klasie wewnętrznej , aby uwzględnić tylko te pola, które chcesz.
  3. Zdefiniuj atrybut exclude w klasie wewnętrznej Meta, aby wyświetlić listę pól, których nie chcesz.

Więc jeśli twój model ma pola field1, field2 i field3 i nie chcesz field3, technika # 2 będzie wyglądać następująco:

class MyModelForm(ModelForm): 
    class Meta: 
     model = MyModel 
     fields = ('field1', 'field2') 

i technika # 3 będzie wyglądać następująco:

class MyModelForm(ModelForm): 
    class Meta: 
     model = MyModel 
     exclude = ('field3',) 
+3

Jak już napisałem w powyższym komentarzu, muszę usunąć pola dynamicznie, czyli w metodzie __init __-. Dlatego nie można użyć metod, które zasugerowałeś. – schneck

+0

Co masz na myśli, usuwając pola "dynamicznie"? – Selene

+1

@Selene: oznacza to, że pola, które będą wyświetlane (/ sprawdzane/zapisywane) są określane w czasie wykonywania, a nie w czasie projektowania. – schneck

13

Miałem ten sam problem. Jest to, jak zrobiłem to działa w nowej Django (tułowia):

class MyModelAdmin(admin.ModelAdmin): 
    # Your stuff here.. 

    def get_form(self, request, obj=None, **kwargs): 
     if request.user.is_staff: # condition 
      self.exclude = ('field',) 
     return super(PublishAdmin, self).get_form(request, obj=obj, **kwargs) 

nadrzędnymi metodę get_form i oddanie logiki tutaj można wybrać Form chcesz mieć wyświetlane. Powyżej pokazałem standardowy formularz po spełnieniu warunku.

+2

Wow, oczywiście, to ma sens. W ten sposób zaadaptowałem go do mojego użytku: a) zainicjuję 'MyModelAdmin' za pomocą' exclude = [] '(lub cokolwiek, co wyklucza podstawa), a następnie wykonaj' self.exclude.append ('field') 'gdy spełnione są warunki . – hangtwenty

+0

Również tylko notatkę (której nie mogłem edytować, ponieważ była zbyt mała): 'user.is_staff' jest właściwością, a nie metodą, więc wywołanie go spowoduje błąd. – hangtwenty

+0

Czy to wątek bezpieczne? – frnhr

2

Działa to świetnie ...

def __init__(self, instance, *args, **kwargs):  
    super(FormClass, self).__init__(instance=instance, *args, **kwargs) 
    if instance and instance.item: 
     del self.fields['field_for_item'] 
+0

AFAIK field_for_item zostanie ustawiony na none, jeśli go brakuje w formula.cleaned_data. Bądź ostrożny: może to spowodować usunięcie wartości w kolumnie db: field_for_item! – guettli

Powiązane problemy