Sunday, August 26, 2012

Re: ModelMultipleChoiceField with MultiWidget ?



Finally, I'm starting to see some light and it is almost working.

From what I see I reckon you will need to create both a custom field and a custom widget!

I think so because if you have TextInputs validation may fail on the ModelMultipleChoiceField?

Yes, they do,  because it checks that the value is a pk
on the related table (attribute in this case)

I would think you need to override the methods: __init__, clean, to_python and compress.
 

With __init__ and clean is enough
 
I think you will also need to create a more customized widget inheriting directly from MultiWidget?
I think you would need to override the methods: __init__, render, decompress

Yes also,
 

But I'm no expert ;-(


Well, you are closer than I am :)

Thanks for the help.
 

On Sun, Aug 26, 2012 at 7:42 PM, Nicolas Emiliani <or3st3s@gmail.com> wrote:
Hi, 

I've been struggling with this for the past two weeks, and i think it's time to ask.

I have and admin form that has a ModelMultipleChoiceField that is used to display
a ManyToMany model field that specifies a through model

class Person(models.Model):
    name = models.CharField(max_length=10)
    attributes = models.ManyToManyField('Attribute',through='Has',
                                        blank=True, null=True)

class Has(models.Model):
    person = models.ForeignKey('Person')
    attribute = models.ForeignKey('Attribute')
    value = models.CharField(max_length=10)

    
class Attribute(models.Model):
    name = models.CharField(max_length=10)
    atype = models.CharField(max_length=2, 
                                          choices=(('TF','true/false'),
                                                       ('IN','text')))


class PersonAdminForm(forms.ModelForm):

    class Meta:
        model = Person
    
    attrs = forms.ModelMultipleChoiceField( \
                    label='Attributes',
                    queryset=Attribute.objects.all(),
                    widget=forms.CheckboxSelectMultiple(),
                    )


This CheckboxSelectMultiple works fine, but I want to be able to render
each relation according to the Attribute.atype value, meaning if it is TF,
then tender it as a CheckBox, if it is IN the render it as an InputText

I inherited from CheckboxSelectMultiple so it does that, but then when I'm
on the admin form and for one specific attribute of type IN, rendered as a
TextInput,  I set a value (let's say 500) and then press save , the method

SelectMultiple.value_from_datadict gets called and passed as data :

<QueryDict: {u'csrfmiddlewaretoken': [u'GWLnuoTSTjjLmpYOizodBA4VA1FmwdQw'], 
u'_continue': [u'Save and continue editing'], u'name': [u'nico'], u'attrs': [ u'2']}>

And this is what has been driving me nuts! 

u'attrs': [ u'2'], 

As you can see it only passes the id of the attribute, not the id and the value. What I
need is something like 

u'attrs': [ (u'2','500')], 

Any ideas on how to fix this ?

Thanks!

--
Nicolas Emiliani

Lo unico instantaneo en la vida es el cafe, y es bien feo.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.



--
Nicolas Emiliani

Lo unico instantaneo en la vida es el cafe, y es bien feo.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment