Джанго-нонрел в Google App Engine ListField - PullRequest
1 голос
/ 08 октября 2010

Я пытаюсь создать пример приложения в Google App Engine, используя django-nonrel.и у меня возникают проблемы при реализации атрибута ListField в модель.

Я создал приложение test_model и включил его в качестве установленного приложения в мои настройки.Model.py:

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)

Приведенный выше пример дает мне:AttributeError: у объекта 'module' нет атрибута 'Model'

Если я закомментирую импорт djangotoolbox, я получу следующее:AttributeError: у объекта 'module' нет атрибута 'ListField'

Что я здесь не так делаю?Я не могу найти документацию о том, как использовать ListField в django-nonrel.Это потому, что это должно быть действительно очевидно?

Ответы [ 4 ]

4 голосов
/ 09 октября 2010

Ваш импорт разбивает друг друга:

from django.db import models
from djangotoolbox import *

Второй импорт заменит модели django.db модулем пустых моделей djangotoolbox. Использование from X import * является ужасной идеей в Python и в целом приводит к сбивающим с толку результатам.

Если вы хотите использовать ListField из djangotoolbox, используйте:

from djangotoolbox import fields

и ссылаться на класс ListField как fields.ListField.

3 голосов
/ 08 июня 2011

ОК, вот что я сделал, чтобы использовать ListFields.MyClass соответствует вашему Example классу, а AnotherClass соответствует вашему Choice_examples.То, что я опишу, позволит вам использовать ListField s в интерфейсе администратора и ваших собственных представлениях.

Я начну с самого начала

Вот как выглядит моя модель

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

Я хотел иметь возможность использовать интерфейс администратора для создания / редактирования экземпляров этой модели, используя виджет множественного выбора для поля списка.Поэтому я создал несколько пользовательских классов следующим образом:

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

Эти классы позволяют использовать поле списка в админке.Затем я создал форму для использования на сайте администратора

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

После этого я создал модель администратора и зарегистрировал ее на сайте администратора

class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

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

admin.site.register(MyClass, MyClassAdmin)

Это теперь работает вмой кодИмейте в виду, что этот подход может не совсем подходить для google_appengine, так как я не очень разбираюсь в том, как он работает, и он может создавать неэффективные запросы, такие.

1 голос
/ 12 октября 2010

Похоже, ответ в том, что вы не можете передать объект в поля. ListField.

Я отказался от попыток работать с ListField, так как документация ограничена, и мои навыки кодирования находятся не на том уровне, чтобы я мог с этим разобраться.

Любому другому, сталкивающемуся с подобной проблемой, следует подумать о создании новой модели для сопоставления отношений ManyToMany. И если представление администратора важно, вы должны изучить следующее, чтобы отобразить таблицу ManyToMany, встроенную в любое представление администратора:

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

1 голос
/ 08 октября 2010

Не знаю, но попробуйте:

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)
...