@@ -18,6 +18,7 @@ class TagField(CharField):
18
18
def __init__ (self , * args , ** kwargs ):
19
19
kwargs ['max_length' ] = kwargs .get ('max_length' , 255 )
20
20
kwargs ['blank' ] = kwargs .get ('blank' , True )
21
+ kwargs ['default' ] = kwargs .get ('default' , '' )
21
22
super (TagField , self ).__init__ (* args , ** kwargs )
22
23
23
24
def contribute_to_class (self , cls , name ):
@@ -29,6 +30,9 @@ def contribute_to_class(self, cls, name):
29
30
# Save tags back to the database post-save
30
31
signals .post_save .connect (self ._save , cls , True )
31
32
33
+ # Update tags from Tag objects post-init
34
+ signals .post_init .connect (self ._update , cls , True )
35
+
32
36
def __get__ (self , instance , owner = None ):
33
37
"""
34
38
Tag getter. Returns an instance's tags if accessed on an instance, and
@@ -52,13 +56,6 @@ class Link(models.Model):
52
56
if instance is None :
53
57
return edit_string_for_tags (Tag .objects .usage_for_model (owner ))
54
58
55
- tags = self ._get_instance_tag_cache (instance )
56
- if tags is None :
57
- if instance .pk is None :
58
- self ._set_instance_tag_cache (instance , '' )
59
- else :
60
- self ._set_instance_tag_cache (
61
- instance , edit_string_for_tags (Tag .objects .get_for_object (instance )))
62
59
return self ._get_instance_tag_cache (instance )
63
60
64
61
def __set__ (self , instance , value ):
@@ -76,8 +73,14 @@ def _save(self, **kwargs): #signal, sender, instance):
76
73
Save tags back to the database
77
74
"""
78
75
tags = self ._get_instance_tag_cache (kwargs ['instance' ])
79
- if tags is not None :
80
- Tag .objects .update_tags (kwargs ['instance' ], tags )
76
+ Tag .objects .update_tags (kwargs ['instance' ], tags )
77
+
78
+ def _update (self , ** kwargs ): #signal, sender, instance):
79
+ """
80
+ Update tag cache from TaggedItem objects.
81
+ """
82
+ instance = kwargs ['instance' ]
83
+ self ._update_instance_tag_cache (instance )
81
84
82
85
def __delete__ (self , instance ):
83
86
"""
@@ -97,6 +100,15 @@ def _set_instance_tag_cache(self, instance, tags):
97
100
"""
98
101
setattr (instance , '_%s_cache' % self .attname , tags )
99
102
103
+ def _update_instance_tag_cache (self , instance ):
104
+ """
105
+ Helper: update an instance's tag cache from actual Tags.
106
+ """
107
+ # for an unsaved object, leave the default value alone
108
+ if instance .pk is not None :
109
+ tags = edit_string_for_tags (Tag .objects .get_for_object (instance ))
110
+ self ._set_instance_tag_cache (instance , tags )
111
+
100
112
def get_internal_type (self ):
101
113
return 'CharField'
102
114
0 commit comments