开发者

Django-nonrel in Google App Engine ListField

开发者 https://www.devze.com 2023-01-19 17:06 出处:网络
I am trying to build an example app in Google App Engine using django-nonrel. and am having problems implementing ListField attribute into a model.

I am trying to build an example app in Google App Engine using django-nonrel. and am having problems implementing ListField attribute into a model.

I have created an app test_model and have included it as an installed app in my settings. The model.py is:

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)

The above example gives me:

AttributeError:'module' object has no attribute 'Model'

If I comment out the djangotoolbox import, I get the following :

AttributeError: 'module' object has no attribute开发者_如何学JAVA 'ListField'

What am I doing wrong here? I can't seem to find any documention as to how to go about using ListField in django-nonrel. Is that because it is supposed to really obvious?


Your imports are smashing each other:

from django.db import models
from djangotoolbox import *

The second import will replace the django.db models with djangotoolbox' empty models module. Using from X import * is a terrible idea in general in Python and produces confusing results like these.

If you're looking to use ListField from djangotoolbox, use:

from djangotoolbox import fields

and refer to the ListField class as fields.ListField.


OK, here is what I did to be able to use ListFields. MyClass the equivalent to your Example class and AnotherClass is the same as your Choice_examples. What I describe will allow you to use ListFields in the admin interface and your self implemented views.

I'll start from the beginning

This is what what my model looks like

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

I wanted to be able to use the admin interface to create/edit instances of this model using a multiple select widget for the list field. Therefore, I created some custom classes as follows

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

These classes allow the listfield to be used in the admin. Then I created a form to use in the admin site

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

After having done this I created a admin model and registered it with the admin site

class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

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

admin.site.register(MyClass, MyClassAdmin)

This is now working in my code. Keep in mind that this approach might not at all be well suited for google_appengine as I am not very adept at how it works and it might create inefficient queries an such.


I don't know, but try with:

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)


Looks like the answer is that you cannot pass an object into fields.ListField.

I have ditched trying to work with ListField as documentation is limited and my coding skills aren't at a level for me to work it out.

Anyone else coming across a similar problem, you should consider create a new model to map the ManyToMany relationships. And if the admin view is important, you should look into the following to display the ManyToMany table inline with any given admin view:

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

0

精彩评论

暂无评论...
验证码 换一张
取 消