Search code examples
mongodbdjango-admindjango-nonrellistfield

Django-Nonrel with Mongodb listfield


I am trying to implement manytomany field relation in django-nonrel on mongodb. It was suggessted at to:

Django-nonrel form field for ListField

Following the accepted answer

models.py

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

i am not sure where the following goes, it has been tested in fields.py, widgets,py, models.py

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

admin.py

class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

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

admin.site.register(MyClass, MyClassAdmin)

The following Errors keep popping up:

If the middle custom class code is used in models.py

name 'SelectMultiple' is not defined

If custom class code is taken off models.py:

No form field implemented for <class 'djangotoolbox.fields.ListField'>

Solution

  • You just need to import SelectMultiple by the sound of it. You can put the code in any of those three files, fields.py would make sense.

    Since it's pretty usual to have:

    from django import forms
    

    at the top of your file already, you probably just want to edit the code below to:

    # you'll have to work out how to import the Mongo ListField for yourself :)
    class ModelListField(ListField):
        def formfield(self, **kwargs):
        return FormListField(**kwargs)
    
    class ListFieldWidget(forms.SelectMultiple):
        pass
    
    class FormListField(forms.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
    

    You probably also want to try and learn a bit more about how python works, how to import modules etc.