2010-10-07 6 views
1

J'essaie de créer un exemple d'application dans Google App Engine en utilisant django-nonrel. et j'ai des problèmes pour implémenter l'attribut ListField dans un modèle.Django-nonrel dans Google App Engine ListField

J'ai créé une application test_model et l'ai incluse comme application installée dans mes paramètres. Le model.py est:

 
from django.db import models 
from djangotoolbox import * 
from dbindexer import * 

# Create your models here. 
class Example(models.Model): 
    some_choices = models.ListField('Choice_examples') 
    notes = models.CharField(max_length='20') 
    updated_at = models.DateTimeField(auto_now=True) 

    def __unicode__(self): 
     return u'%s' % (self.notes) 


class Choice_examples(models.Model): 
    name = models.CharField(max_length='30') 

    def __unicode__(self): 
     return u'%s' % (self.name) 

L'exemple ci-dessus me donne:
AttributeError: objet 'module' n'a pas d'attribut 'modèle'

Si je commente sur l'importation de djangotoolbox, je reçois le texte suivant:
AttributeError: l'objet 'module' n'a pas d'attribut 'ListField'

Qu'est-ce que je fais de mal ici? Je n'arrive pas à trouver de documentation sur la façon d'utiliser ListField dans django-nonrel. Est-ce parce que c'est censé être vraiment évident?

Répondre

1

On dirait que la réponse est que vous ne pouvez pas passer un objet dans fields.ListField.

J'ai hésité à essayer de travailler avec ListField car la documentation est limitée et mes compétences de codage ne sont pas à un niveau pour que je puisse le résoudre. Si vous rencontrez un problème similaire, vous devriez envisager de créer un nouveau modèle pour mapper les relations ManyToMany. Et si la vue admin est important, vous devriez regarder dans les éléments suivants pour afficher la ligne de table ManyToMany avec une vue admin donné:

http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#s-working-with-many-to-many-models

1

Je ne sais pas, mais essayez avec:

class Choice_examples(models.Model): 
    name = models.CharField(max_length='30') 

    def __unicode__(self): 
     return u'%s' % (self.name) 

class Example(models.Model): 
    some_choices = models.ListField(Choice_examples) 
    notes = models.CharField(max_length='20') 
    updated_at = models.DateTimeField(auto_now=True) 

    def __unicode__(self): 
     return u'%s' % (self.notes) 
+0

Merci pour la suggestion Sahid, j'ai essayé les changements que j'ai rassemblés, 1) la réorganisation des classes 2) Enlevez les guillemets simples de Choice_examples. Malheureusement, ces changements ne l'ont pas résolu. – iali

4

Vos importations Smashing l'autre:

from django.db import models 
from djangotoolbox import * 

La deuxième importation remplacera les modèles django.db avec djangotoolbox » modèles vides module. En utilisant from X import * est une idée terrible en général en Python et produit des résultats confus comme ceux-ci.

Si vous cherchez à utiliser ListField de djangotoolbox, utilisez:

from djangotoolbox import fields 

et reportez-vous à la classe ListField comme fields.ListField.

+0

Merci Greensnark. Je pense que je suis presque là avec ça. Obtention de l'erreur: l'objet 'str' n'a pas d'attribut 'model' – iali

+0

L'emplacement d'exception est: fields.py dans contrib_to_class, ligne 13 – iali

3

OK, voici ce que je l'ai fait pour être en mesure d'utiliser ListFields. MyClass l'équivalent de votre classe Example et AnotherClass est la même que votre Choice_examples. Ce que je décris vous permettra d'utiliser ListField s dans l'interface d'administration et vos vues auto-implémentées.

Je vais commencer par le début

C'est ce que mon modèle ressemble

class MyClass(models.Model): 
    field = ListField(models.ForeignKey(AnotherClass)) 

Je voulais être en mesure d'utiliser l'interface d'administration pour créer/modifier des instances de ce modèle en utilisant un widget de sélection multiple pour le champ de liste.Par conséquent, j'ai créé certaines classes personnalisées comme suit

class ModelListField(ListField): 
    def formfield(self, **kwargs): 
     return FormListField(**kwargs) 

class ListFieldWidget(SelectMultiple): 
    pass 

class FormListField(MultipleChoiceField): 
    """ 
    This is a custom form field that can display a ModelListField as a Multiple Select GUI element. 
    """ 
    widget = ListFieldWidget 

    def clean(self, value): 
     #TODO: clean your data in whatever way is correct in your case and return cleaned data instead of just the value 
     return value 

Ces classes permettent d'utiliser le champ liste dans l'admin. Ensuite, je créé un formulaire à utiliser dans le site d'administration

class MyClassForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyClasstForm,self).__init__(*args, **kwargs) 
     self.fields['field'].widget.choices = [(i.pk, i) for i in AnotherClass.objects.all()] 
     if self.instance.pk: 
      self.fields['field'].initial = self.instance.field 

    class Meta: 
     model = MyClass 

Après avoir fait cela, je créé un modèle d'administration et enregistré avec le site d'administration

class MyClassAdmin(admin.ModelAdmin): 
    form = MyClassForm 

    def __init__(self, model, admin_site): 
     super(MyClassAdmin,self).__init__(model, admin_site) 

admin.site.register(MyClass, MyClassAdmin) 

Cela fonctionne maintenant dans mon code. Gardez à l'esprit que cette approche ne convient peut-être pas du tout à google_appengine car je ne suis pas très doué pour son fonctionnement et cela pourrait créer des requêtes inefficaces.