[Django]-Django: MultipleChoiceField in admin to carry over previously saved values

3👍

Solution:

Setting the choices by a integer, instead of a string.

POST_TYPES = (
    (1,     'Blog'),
    (2,     'Portfolio'),
    (3,     'Beeldbank'),
)

Damn, that wasn’t worth breaking my skull over.

👤Kasper

2👍

Might not be correct, but for my usecase, I did not want to replace the values with integers (as per the accepted answer). This was arrived at by a smidge of trial-and-error, and a lot of stepping through Django internals. Works for me, but YMMV:

from django.forms.widgets import (
    CheckboxSelectMultiple as OriginalCheckboxSelectMultiple,
)

class CheckboxSelectMultiple(OriginalCheckboxSelectMultiple):
    def optgroups(self, name, value, attrs=None):
        # values come back as e.g. `['foo,bar']`, which we don't want when inferring "selected"
        return super().optgroups(name, value[0].split(","), attrs)

0👍

Maybe I’m not understanding your question completely, but it seems like you could simplify a little. Using ModelForms, I don’t think any of your overriding the _init_ in your form is necessary. Try this and see if you get your desired behavior.

models.py

class Module(models.Model):
    POST_TYPES = (
        ('blog', 'Blog'),
        ('portfolio', 'Portfolio'),
    )

    title        =   models.CharField(max_length=100, verbose_name='title')        
    entriesFrom  =   models.CharField(max_length=100, verbose_name='Pull content from', choices=POST_TYPES, blank=True)

    def __unicode__(self):
       return self.title

forms.py

class ModuleForm(forms.ModelForm):
    class Meta:
        model = Module

admin.py

from django.contrib import admin
admin.site.register(models.Module)

If my answer isn’t what you’re looking for, try clarifying your question and I’ll see if I can help you out.

👤Aaron

0👍

you can use this function to remove string mark

from ast import literal_eval

literal_eval(value)

0👍

I faced this issue, my changes haven’t affected on save.
I use CharField in model, but in forms.py;

class ModuleForm(forms.ModelForm):
    my_field = forms.MultipleChoiceField(
            choices=POST_TYPES, 
            widget=CheckboxSelectMultiple,
            required=False,) 

    def __init__(self, *args, **kwargs):
        super(ModuleForm, self).__init__(*args, **kwargs)
        if kwargs.get('instance'):
            self.initial['my_field'] = eval(self.initial['my_field'])

This form solution worked for me on MultipleChoiceField on Django Admin.

Leave a comment