2011-03-21 10 views
6

मैं निम्नलिखित फार्म और विरासत में मिला रूप है:मैं Django में किसी रूप में विरासत वाले क्षेत्र को कैसे बाहर निकालूं?

class UsuarioAdminForm(ModelForm): 

    first_name = forms.CharField(label='Nombre', help_text = 'Nombre del usuario', required=True) 
    last_name = forms.CharField(label='Apellidos', help_text = 'Apellidos del usuario', required=True) 
    dni = ESIdentityCardNumberField(help_text = 'DNI del usuario', required=True, widget = forms.TextInput(attrs = {'size': 9})) 
    username = forms.CharField(label='Login', help_text = 'Requerido. 30 caracteres o menos. Letras, números y @/./+/-/_', widget = forms.TextInput(attrs = {'size': 15})) 
    #password = forms.CharField(widget=forms.PasswordInput(attrs = {'size': 12}), label='Contraseña', help_text = 'Contraseña del usuario') 
    email = forms.EmailField(help_text = 'Correo electrónico del usuario', required=True) 
    movil = ESPhoneNumberField(help_text = 'Movil principal del usuario', required=True, widget = forms.TextInput(attrs = {'size': 9 })) 
    is_staff = forms.BooleanField(label = "Administrador", help_text = 'Marque la casilla si desea crear un administrador') 
    tipo_u = forms.ChoiceField(label = 'Tipo de usuario', choices = TipoUsuarios) 
    def clean(self): 
     try: 
      cleaned_data = self.cleaned_data 
      movil = self.cleaned_data['movil'] 
      dni = self.cleaned_data['dni'] 
      email = self.cleaned_data['email'] 
     except: 
      raise forms.ValidationError(u'Todos los campos del Formulario son Obligatorios.') 

     return cleaned_data 

    class Meta: 
     model = Usuario 
     exclude = ('is_active','date_joined', 'last_login', 'user_permissions', 'tipo', 'groups', 'is_superuser',) 


class UsuarioForm(UsuarioAdminForm): 

    is_staff = None 

    def __init__(self, *args, **kwargs): 
     self.is_staff = None 
     super(UsuarioForm,self).__init__(*args, **kwargs) 

    class Meta: 
     model = Usuario 
     exclude = ('is_staff', 'is_active','date_joined', 'last_login', 'user_permissions', 'tipo', 'groups', 'is_superuser', 'password',) 

लेकिन जब मैं एक UsuarioForm वस्तु बनाने, क्यों यह is_staff क्षेत्र दिखाता है?

अद्यतन:

def __init__(self, *args, **kwargs): 
    super(UsuarioForm,self).__init__(*args, **kwargs)   
    self.is_staff = None 

तुम भी कर सकता है::

TemplateSyntaxError at /sms/usuarios/add/user/

Caught AttributeError while rendering: 'NoneType' object has no attribute 'label'

+0

फिर इसे जोड़ने के लिए आसान है, "is_staff" फ़ील्ड के बिना UsuarioForm बनाएं और UsuarioAdminForm wil में केवल एक - वास्तविक "is_staff = .." (यह सबसे आसान है और हमेशा काम करेगा)। क्लास एट्रिब्यूट को निकालने के लिए आप del (self.is_staff) (__init__ में) का उपयोग कर सकते हैं लेकिन इसके अतिरिक्त परिणाम हो सकते हैं क्योंकि मेटा क्लासेस शामिल हैं - इसलिए इसका उपयोग न करने का प्रयास करें। :) – Jerzyk

उत्तर

7

हो सकता है कि आप इस लाइनों के आदेश को बदल सकता है:

तो मैं self.fields['is_staff'] = None डाल मैं अगले त्रुटि प्राप्त

def __init__(self, *args, **kwargs): 
    super(UsuarioForm,self).__init__(*args, **kwargs) 
    self.fields.pop('is_staff') 
-1

Django रूप उदाहरणों तो अपने init में, सुपर फोन कर के बाद, आप निम्न की तरह कुछ की जरूरत है, प्रपत्र पर ही 'क्षेत्रों' विशेषता में खेतों की दुकान:

self.fields['is_staff'] = None 

कि आपकी समस्याओं का समाधान करना चाहिए; self.is_staff को सेट करना सिर्फ एक असंबंधित चर है (क्लास पर सेट किया गया is_staff एक क्लास वैरिएबल है जो एक आवृत्ति चर नहीं है)।

+0

तो मैं self.fields डाल [ 'is_staff'] = कोई नहीं मैं अगले त्रुटि प्राप्त: 'NoneType' ऑब्जेक्ट कोई विशेषता 'है:/एसएमएस/usuarios// उपयोगकर्ता/ AttributeError पकड़ा जबकि प्रतिपादन जोड़ने पर TemplateSyntaxError लेबल ' – grouser

+0

जब आप ऑब्जेक्ट करते हैं तो इसे दिखाने के लिए आपको इसे प्रदर्शित करने के दौरान तर्क में जोड़ना होगा। यदि यह व्यवस्थापक अनुभाग में केवल महत्वपूर्ण है तो आप वास्तव में ModelAdmin क्लास पर 'बहिष्कृत' सेटिंग का उपयोग कर सकते हैं। http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin। –

+0

सेटिंग फ़ील्ड को छोड़कर सभी चीजों को सबसे खराब कर देगा, यदि आपको आवश्यकता हो - इसे सूची से हटाएं ('del' का उपयोग करके) लेकिन * इसे किसी भी पर सेट न करें * क्योंकि यह बेसफिल्ड का उदाहरण होने की उम्मीद है और यह नहीं है बुरी तरह दुर्घटनाग्रस्त हो जाएगा – Jerzyk

0

यह एक पुरानी सवाल है, लेकिन Django 1.7.x में शुरू आप बस अनुसरण कर सकते हैं:

class UsuarioForm(UsuarioAdminForm): 

    is_staff = None 

    class Meta: 
     model = Usuario 
     exclude = ('is_active', 'date_joined', 'last_login', 'user_permissions', 'tipo', 'groups', 'is_superuser', 'password') 

Meta की exclude भाग केवल ModelForm तत्वों को छोड़कर के लिए है, लेकिन किसी भी रूप तत्व बाहर रखा जा सकता घोषणाओं में इसे None पर सेट करके।

Django docs on subclassing forms से:

It’s possible to declaratively remove a Field inherited from a parent class by setting the name of the field to None on the subclass. For example:

>>> from django import forms 

>>> class ParentForm(forms.Form): 
...  name = forms.CharField() 
...  age = forms.IntegerField() 

>>> class ChildForm(ParentForm): 
...  name = None 

>>> ChildForm().fields.keys() 
... ['age'] 

संपादित:

मुझे लगता है कि उदाहरण में ऊपर काम करता है को देखते हुए, लेकिन यह क्षेत्रों Meta की वजह से बनाए जाते हैं के लिए काम करने के लिए प्रतीत नहीं होता ModelForm पर। मुझे लगता है कि उन मामलों में आपको माता-पिता के Meta से उत्तराधिकारी होना चाहिए और दिए गए फ़ील्ड को बदलना होगा।

संबंधित मुद्दे