2012-10-25 15 views
14

Ho iniziato a sperimentare con django-mutant 0.0.2 (su django 1.4.2), ma a causa della mancanza di documentazione non ho ottenuto quasi nulla. Il modo in cui ho capito dalla descrizione del progetto l'ho usato per creare i miei modelli in modo dinamico, quindi ho pensato di collegarlo all'interfaccia django-admin, così posso creare i modelli e definire tutti i suoi campi. Ho visto alcune altre alternative come django-eav, dynamo, Will Hardy's dynamic-models, ecc. Ma sembra che questa sia la migliore implementazione fino ad ora, quindi ho pensato che avrei dovuto usare questo.django-mutant che crea modelli in django-admin

Ho messo questo in settings.py:

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'south', 
    'polymodels', 
    'mutant', 
    'mutant.contrib.boolean', 
    'mutant.contrib.temporal', 
    'mutant.contrib.file', 
    'mutant.contrib.numeric', 
    'mutant.contrib.text', 
    'mutant.contrib.web', 
    'mutant.contrib.related', 
    'dynamodels' # this is the name of my testapp 
) 

ho aperto la fonte di django-mutant per capire cosa devo fare, e ho pensato che basta importare il mutant.models.ModelDefinition e mutant.models.FieldDefinition nel mio admin.py e registrare loro, così ho provato questo:

from django.contrib import admin 

from mutant import models 


class ModelDefinitionAdmin(admin.ModelAdmin): 
    pass 

admin.site.register(models.ModelDefinition, ModelDefinitionAdmin) 


class FieldDefinitionAdmin(admin.ModelAdmin): 
    pass 

admin.site.register(models.FieldDefinition, FieldDefinitionAdmin) 

Dopo uno syncdb, ho preso in esecuzione, e ho avuto una sezione "mutante" nella mia interfaccia di amministrazione, al suo interno una "definizione Models" e "campi". Ho aggiunto un modello con successo, sebbene non potessi specificare nessun appname presente nell'elenco di INSTALLED_APPS. L'aggiunta di un campo non è andata a buon fine, poiché è il parametro Model def Ho scelto il modello che ho creato in precedenza (era l'unico nell'elenco) e ho scelto "Definizione campo intero" per Content type. Premendo il pulsante salvare mi ha dato questo:

NotImplementedError at /admin/mutant/fielddefinition/add/ 

No exception supplied 
... 
... 
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in save 
     return super(FieldDefinition, self).save(*args, **kwargs) ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_polymodels-1.0.1-py2.6.egg/polymodels/models.py in save 
     return super(BasePolymorphicModel, self).save(*args, **kwargs) ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in save 
     self.model_def.model_class(force_create=True) ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in model_class 
      model_class = self._create_model_class(existing_model_class) ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in _create_model_class 
     attrs = self.get_model_attrs(existing_model_class) ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in get_model_attrs 
          for f in self.fielddefinitions.select_subclasses())) ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in <genexpr> 
          for f in self.fielddefinitions.select_subclasses())) ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in field_instance 
     cls = self.get_field_class() ... 

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in get_field_class 
      raise NotImplementedError 

Quindi non può essere il modo in cui avrei dovuto definire i miei campi (o anche modelli?) .. Su page del progetto v'è un frammento, che sottoclassi della classe FieldDefinition, creando a DateFieldDefinition, se inserisco lo snippet nel mio models.py e registro quella classe nel mio amministratore, posso aggiungere qualsiasi tipo di campo con successo. Significa che devo creare una sottoclasse di tutti i tipi di campi che voglio utilizzare per poterli creare nell'amministratore? Sono effettivamente legati al mio modello quando li creo in questo modo? C'è un esempio funzionante da qualche parte per mostrare almeno le basi? Mi spiace che questa fosse la versione più corta che avrei potuto trovare, ogni suggerimento sarebbe apprezzato.

UPDATE: Ho fatto un errore nello specificare la versione che cercavo, ho avuto l'NotImplementedError per l'ultima versione dev (che è anche 0.0.2 tra l'altro), ma quando ho provato la vera 0.0. 2 ottenuto da PyPi allo stesso modo dello sviluppatore, ho ricevuto un errore di modulo senza un messaggio di errore, ma sicuramente qualcosa non è riuscito alla validazione. Quindi generalmente non sono più vicino alla soluzione.

UPDATE2: ho registrato i tipi di campo di base di mutanti dinamicamente nel admin, e sono in grado ora di aggiungere/modificare/cancellare i modelli e campi con questa amministrazione frammento:

from django.contrib import admin 

from mutant import models 

for field_type in models.FieldDefinitionBase._field_definitions.values(): 
    attrs = {'model': field_type} 
    FieldDefAdmin = type('{0}Admin'.format(field_type.__name__), 
         (admin.ModelAdmin,), 
         attrs) 
    admin.site.register(field_type, FieldDefAdmin) 


class ModelDefinitionAdmin(admin.ModelAdmin): 
    model = models.ModelDefinition 

admin.site.register(models.ModelDefinition, ModelDefinitionAdmin) 

Tuttavia quando ho ispezionare per esempio, i dati reali nel mio database dalla console mysql, la mia tabella non è presente nel database. Ci sono le tabelle dei mutanti e contengono le voci sul mio modello e sui miei campi, ma ho pensato che una volta costruita la classe del modello dinamico, sarà anche scritta nel database così com'è.

Update3: In realtà mi sbagliavo, la tavola si trova nel mio database, è solo il prefisso "mutant_" così non ho riconosciuto che c'è.Sembra che questo sarà un metodo valido per lavorare con esso, anche se per fare in modo che un'interfaccia user-friendly decente funzioni con esso richiederà più lavoro.

+9

Si prega di rispondere alla tua domanda. Grazie – n3storm

+0

Ciao Andrea, come stanno andando le tue opere? Puoi condividere un esempio funzionante che usi il django-mutante? –

+0

Sto lavorando su un'interfaccia CRUD per mutante, ma sfortunatamente il mio lavoro lascia molto poco tempo per i progetti collaterali. Non appena avrò un prototipo funzionante, lo condividerò. – andrean

risposta

Problemi correlati