Ticket #17648: ticket-17648-contenttype-manager-get_for_model-proxy.diff

File ticket-17648-contenttype-manager-get_for_model-proxy.diff, 1.3 KB (added by Simon Charette, 12 years ago)

Make sure ContentType.get_for_model(s) returns the correct ContentType for proxy models without breaking dereferred model compatibility introduced for #10738.

  • django/contrib/contenttypes/models.py

    diff --git a/django/contrib/contenttypes/models.py b/django/contrib/contenttypes/models.py
    index 1bb07e0..d03f770 100644
    a b def get_by_natural_key(self, app_label, model):  
    1717
    1818    def _get_opts(self, model):
    1919        opts = model._meta
    20         while opts.proxy:
    21             model = opts.proxy_for_model
    22             opts = model._meta
     20        if model._deferred:
     21            opts = opts.proxy_for_model._meta
    2322        return opts
    2423
    2524    def _get_from_cache(self, opts):
  • tests/modeltests/proxy_models/tests.py

    diff --git a/tests/modeltests/proxy_models/tests.py b/tests/modeltests/proxy_models/tests.py
    index 3ec8465..04ea203 100644
    a b def _handler(*args, **kwargs):  
    217217        signals.post_save.disconnect(h6, sender=MyPersonProxy)
    218218
    219219    def test_content_type(self):
     220        # A model and a proxy of this model do not
     221        # share the same ContentType see #17648
    220222        ctype = ContentType.objects.get_for_model
    221         self.assertTrue(ctype(Person) is ctype(OtherPerson))
     223        self.assertFalse(ctype(Person) is ctype(OtherPerson))
    222224
    223225    def test_user_userproxy_userproxyproxy(self):
    224226        User.objects.create(name='Bruce')
Back to Top