2012-10-25 19 views
14

Zacząłem eksperymentować z django-mutant 0.0.2 (na django 1.4.2), ale z powodu braku dokumentacji dotarłem prawie nigdzie. Sposób, w jaki zrozumiałam w opisie projektu mógłbym go użyć do dynamicznego tworzenia moich modeli, więc pomyślałem, że mogę go podłączyć do interfejsu django-admin, więc mogę stworzyć modele i zdefiniować tam wszystkie jego pola. Widziałem inne alternatywy, takie jak django-eav, dynamo, Will Hardy's dynamic-models itp., Ale wydaje mi się, że jest to najlepsze wdrożenie do tej pory, więc pomyślałem, że powinienem to wykorzystać.Django-mutant tworząc modele w django-admin

Wrzuciłem to w 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 
) 

otworzyłem źródło django-mutant aby dowiedzieć się, co należy zrobić, a ja myślałem, że to wystarczy, aby zaimportować mutant.models.ModelDefinition i mutant.models.FieldDefinition do mojego admin.py i zarejestrować im, więc próbowałem to:

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) 

Po syncdb, mam to działa, i mam sekcję „mutant” w moim interfejsu administratora, wewnątrz niej definicję „modele” i „Fields”. Z powodzeniem dodałem model, chociaż nie mogłem podać nazwy aplikacji, która znajduje się na liście INSTALLED_APPS. Dodanie pola nie powiodło się, ponieważ podałem parametr, który wcześniej stworzyłem (był to jedyny na liście) i wybrałem "Integer field definition" dla Content type. Naciśnięcie przycisku zapisać dał mi tak:

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 

Więc to nie może być tak powinno definiować moje pola (lub nawet modele?) .. Na stronie projektu znajduje się fragment, który podklas klasy FieldDefinition, tworząc a DateFieldDefinition, jeśli wstawię ten fragment do mojego models.py i zarejestruję tę klasę w moim administratorze, mogę pomyślnie dodać dowolny typ pól. Czy to oznacza, że ​​muszę podklasować wszystkie typy pól, których chcę użyć, aby móc je utworzyć w administracji? Czy są one faktycznie związane z moim modelem, kiedy je tworzę w ten sposób? Czy istnieje gdzieś przykład roboczy, aby pokazać przynajmniej podstawy? Przepraszam, że to była najkrótsza wersja, jaką mogłem wymyślić, każda sugestia byłaby doceniona.

UPDATE: popełniłem błąd w określaniu wersję starałem, mam NotImplementedError do najnowszej wersji dev (który jest również 0.0.2 przy okazji), ale kiedy próbowałem prawdziwe 0.0. 2 dostałem od PyPi w taki sam sposób jak dev, dostałem błąd formy bez komunikatu o błędzie, ale coś nie udało się z pewnością zweryfikować. Więc generalnie nie jestem bliższy rozwiązania.

Update2: Zarejestrowałem typy pól baza mutant dynamicznie w admin, i jestem w stanie teraz, aby dodać/zmienić/usunąć modele i pól z tym administratora fragmencie:

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) 

Jednak kiedy sprawdzać rzeczywiste dane w mojej bazie danych z konsoli mysql, na przykład moja tabela nie jest obecna w bazie danych. Są tabele mutantów i zawierają one wpisy dotyczące mojego modelu i moich pól, ale pomyślałem, że po skonstruowaniu klasy modelu dynamicznego, zostanie ona również zapisana w bazie danych, tak jak jest.

UPDATE3: Właściwie myliłem, tabela znajduje się w mojej bazy danych, to tylko z przedrostkiem „mutant_” więc nie uznają, że tam jest.Wygląda na to, że będzie to właściwa metoda pracy z nim, chociaż stworzenie przyzwoitego, przyjaznego dla użytkownika interfejsu do działania będzie wymagało więcej pracy.

+9

Proszę odpowiedzieć na własne pytanie. Dzięki – n3storm

+0

Cześć Andrean, jak idziesz do tej pory? Czy możesz udostępnić działający przykład, który używa mutanta django? –

+0

Pracuję nad interfejsem CRUD dla mutanta, ale niestety moja praca pozostawia bardzo mało czasu na projekty poboczne. Jak tylko będę miał działający prototyp, podzielę się tym. – andrean

Odpowiedz

5

Ok, przepraszam, ale jestem zbyt zajęty (i prawdopodobnie bardziej leniwy), aby ukończyć przyzwoitą aplikację, jak powiedziałem. Ale aby pomóc choć trochę, stworzyłem brudny post na blogu na ten temat i dodałem przykładową aplikację CRUD dla mutantów, ale uwaga, to naprawdę bardzo podstawowe, tylko po to, aby zademonstrować kilka pierwszych kroków, aby zacząć działać.

http://integricho.github.io/2013/07/22/mutant-introduction/

https://github.com/integricho/mutant-sample-app