For a while there XML.com didn’t handle tags on submitted news items very well. If a tag was included that was in a different case to an existing tag, the preview and publish would result in a 500 server error. Fortunately this was something that wasn’t visible to the outside world, but annoying nonetheless.
Wagtail allows case-insensitive tags, and I had already turned that on (it would be confusing to have searches for the tags “XSLT” and “xslt” return different results, for example). Articles and news items submitted using the standard interface behaved properly, it was just the news items submitted by people without logins on the system that didn’t.
It turns out that the problem lay in the way I called the get_or_create()
method, which is used to look up the tags in the database and then create them if they don’t exist. In my code, that looked like this:
tag, create = Tag.objects.get_or_create(name=tag_name)
By default, this is a case-sensitive method (as it should be, for the general case). To make the lookup case-insensitive, you use name__iexact
instead of name
. The next problem I found was that no tags were being created if the tag didn’t already exist in the database. To create the tag, if you’re using name__iexact
instead of name
for the tag lookup, you also need to give the get_or_create()
method a defaults parameter to use when creating the tag. Now that line looks like this:
tag, create = Tag.objects.get_or_create(defaults={'name': tag_name}, name__iexact=tag_name)
and it all works the way it’s meant to.