rohitjain-rj / django-tagging

Automatically exported from code.google.com/p/django-tagging
Other
0 stars 0 forks source link

Cache not updated after ModelFormset save #227

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
I edit a tagging field with a ModelFormset created by modelformset_factory.

The internal tag field cache would not be updated after the ModelFormset saved.

Original issue reported on code.google.com by google-c...@jensdiemer.de on 3 Dec 2009 at 3:51

GoogleCodeExporter commented 9 years ago
Same error as http://code.google.com/p/django-tagging/issues/detail?id=226 ?

Original comment by google-c...@jensdiemer.de on 3 Dec 2009 at 3:53

GoogleCodeExporter commented 9 years ago
Sorry, it's not a cache problem.

Think the problem is: The ModelFormset doesn't have a .save_m2m() method.

The tags would only be stored in the model tag CharField, but not in
tagging.models.Tag and tagging.models.TaggedItem

Note: I created with modelformset_factory only a formset with the tag field. It 
looks
like this:
{{{
            ModelFormset = modelformset_factory(
                model=MyTaggedModel, extra=0, fields=("tags",)
            )
}}}

My model is not registered with tagging.register(), because then i ran into this
problem: http://code.google.com/p/django-tagging/issues/detail?id=151

Original comment by google-c...@jensdiemer.de on 3 Dec 2009 at 4:56

GoogleCodeExporter commented 9 years ago
I tested it with tagging.register() and then tagging.models.Tag and
tagging.models.TaggedItem updated with the ModelFormset. Why?

Original comment by google-c...@jensdiemer.de on 3 Dec 2009 at 4:58

GoogleCodeExporter commented 9 years ago
Create this unittest for tagging (for insert into tagging/tests/tests.py):
{{{
from django.forms.models import modelformset_factory
class TestTagFieldInFormset(TestCase):
    def test_tag_field_in_modelformset(self):
        """ TagField in a Modelformset created by modelformset_factory """

        FormTest.objects.create(tags=u'test1 test2 test3')
        FormTest.objects.create(tags=u'test4 test5')
        FormTest.objects.create(tags=u'test6 test7')

        ModelFormset = modelformset_factory(model=FormTest, extra=0, fields=("tags",))
        formset = ModelFormset(queryset=FormTest.objects.all())

        data = {
            'form-TOTAL_FORMS': '3', # the number of forms rendered
            'form-INITIAL_FORMS': '3', # the number of forms with initial data
            'form-0-id': "1",
            'form-0-tags': "test1 test2 test3", # Not changed
            'form-1-id': "2",
            'form-1-tags': "new1 new2",
            'form-2-id': "3",
            'form-2-tags': "new3 new4",
        }

        formset = ModelFormset(data, queryset=FormTest.objects.all())
        self.failUnless(formset.is_valid(), "formset is not valid: %r" % formset.errors)

        instances = formset.save(commit=False)
        formset.save_m2m()

        # Check the CharField in the FormTest model.
        # Note: instances contains only the changed items!
        self.failUnlessEqual(len(instances), 2)
        self.failUnlessEqual(instances[0].tags, "new1 new2")
        self.failUnlessEqual(instances[1].tags, "new3 new4")

        # Check the m2m values:
        queryset = FormTest.objects.all()
        self.failUnlessEqual(queryset[0].tags, "test1 test2 test3")
        self.failUnlessEqual(queryset[1].tags, "new1 new2")
        self.failUnlessEqual(queryset[2].tags, "new3 new4")
}}}

The last two failUnlessEqual() would be failed, because the formset didn't 
updated
tagging.models.Tag and tagging.models.TaggedItem

output:
{{{
FAIL: TagField in a Modelformset created by modelformset_factory
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tagging/tests/tests.py", line 966, in test_tag_field_in_modelformset
    self.failUnlessEqual(queryset[1].tags, "new1 new2")
AssertionError: u'test4 test5' != 'new1 new2'
}}}

IMHO it's not a django but: formset.save_m2m() teste exists here:
http://code.djangoproject.com/browser/django/trunk/tests/modeltests/model_formse
ts/models.py#L330

Original comment by google-c...@jensdiemer.de on 4 Dec 2009 at 8:02

Attachments:

GoogleCodeExporter commented 9 years ago
Sorry, my unittest is wrong: I forgot to call formset.save() With this, 
everything
works fine.

But now i see my original problem. The tagging models Tag and TaggedItem are not
updated, if Formset queryset would be limited with: queryset.only("tags")

I updated the teste here. The teste works if the line with """queryset =
queryset.only("tags")""" would be deleted.

Original comment by google-c...@jensdiemer.de on 4 Dec 2009 at 9:57

Attachments: