Patch django form field for testing

2013-04-15 by romanb django, hacks, testing

In case you're wondering how to patch Django form field for testing purposes (like URLField that passes local uri: file://...) here's how:

from .forms import ThatForm
from django import forms

class MyTests(TestCase):
    def test_pass_url(self):
        orig_url = ThatForm.base_fields['url']
        ThatForm.base_fields['url'] = forms.CharField()

        # ... do your thing #

        # and just in case set original field back,
        # if other tests need it:
        ThatForm.base_fields['url'] = orig_url

How I Debug Django (Steve Losh)

2011-12-04 by romanb django, test
2011-07-01 by romanb django, hacks

Django smartspaceless

2010-02-10 by romanb django, hacks

Default django spaceless tag is weird, it consumes all spaces between tags and none inside of them. It's good for small parts of site but...

...But I like my html to be cleared of all unnecessary mess which in many cases end up like this:

<a href="...">link1</a> <a href="...">link2</a>
generates awful:
link1link2

In addition if you like having your templates indented it leaves awful things like:

<div>
                                Test text testt
                             </div>

Here's my "smart" version of strip_spaces_between_tags which can be used with overrided spaceless template tag:

def strip_multiple_spaces_between_tags(value):
    """Returns the given HTML with multiple spaces between tags removed."""
    def tagcheck(obj, prefix='', sufix=''):
        tag = obj.group(1).lower()
        if tag[0] == '/':
            tag = tag[1:]
        if tag != 'pre':
            return '%s<%s>%s' % (prefix, ''.join(obj.groups('')), sufix)
        return obj.group(0)
    def tagprecheck(obj):
        return tagcheck(obj, sufix=' ')
    def tagpostcheck(obj):
        return tagcheck(obj, prefix=' ')

    value = force_unicode(value)
    value = re.sub(r'<(/?[\w]+)([^>]*)>\s{2,}', tagprecheck, value);
    value = re.sub(r'\s{2,}<(/?[\w]+)([^>]*)>', tagpostcheck, value)
    value = re.sub(r'>\s{2,}<', '> <', value)
    return value
strip_multiple_spaces_between_tags = allow_lazy(strip_multiple_spaces_between_tags, unicode)

This does few things:

  • it removes all multiple spaces between tags,
  • it removes all multiple spaces at from "<tag> HERE text HERE </tag>" on all tags except pre.
If you find it useful or you have fix/extension to it (any other tag I should think of?) please feel free to comment.