Django templates stripping spaces?

后端 未结 8 446
心在旅途
心在旅途 2021-01-08 00:06

I\'m having trouble with Django templates and CharField models.

So I have a model with a CharField that creates a slug that replaces spaces with underscores. If I cr

相关标签:
8条回答
  • 2021-01-08 00:32

    This tag keeps spaces and newlines. I copied Django's own tag linebreaksbr and then added a line to replace the spaces with nbsp. It does not replace single spaces so text source is still readable. I wrote this because I couldn't get the spacify tag (other answer) to work with linebreaksbr.

    from django.template.defaultfilters import stringfilter
    from django.utils.safestring import mark_safe, SafeData
    from django.utils.text import normalize_newlines
    from django.utils.html import escape
    
    @register.filter(is_safe=True, needs_autoescape=True)
    @stringfilter
    def keep_spacing(value, autoescape=None):
        autoescape = autoescape and not isinstance(value, SafeData)
        value = normalize_newlines(value)
        if autoescape:
            value = escape(value)
        value = mark_safe(value.replace('  ', '  '))             
        return mark_safe(value.replace('\n', '<br />'))
    
    0 讨论(0)
  • 2021-01-08 00:32

    '\s' might be ok in the use case described above, but be careful, this replaces other whitespaces like '\t' or '\n' as well! If this is not what you want, just use " " instead.

    0 讨论(0)
  • 2021-01-08 00:35

    Django sees the object internally as having two spaces (judging by the two underscores and two spaces in the repr output). The fact that it only shows up with one space in the template is just how HTML works. Notice how, in the question you just asked, most of the places where you entered two spaces, only one is showing up?

    From the HTML4 Spec:

    In particular, user agents should collapse input white space sequences when producing output inter-word space.

    As S.Lott suggested, you can verify that my guess is correct by adding debug logging, or using the Firebug plugin for Firefox or something similar, to see exactly what's getting sent to the browser. Then you'll know for sure on which end the problem lies.

    If multiple spaces are really important to you, you'll need to use the &nbsp; entity, though I don't know offhand how you'd get Django to encode the output of that specific object using them.

    0 讨论(0)
  • 2021-01-08 00:37

    if you are looking for a way to remove spaces in your html then this might be what you are looking for:

    html_tag|cut:" "
    

    cut is a builtin tag for filtering in your html. Lets say you want to use an id for each html tag to be used as a permalink to reference while you generate this dynamically then for example your solution would be:

    <div id="{{category_name|cut:' ' }}">
    

    django documentation

    0 讨论(0)
  • 2021-01-08 00:39

    For someone having issue with django template try this : I had a similar issue with my <optgorup> tag, i am getting my values from django model to display under select. I simple used '' around label option to get the complete text with space.<optgroup label='{{key}}'>

    0 讨论(0)
  • 2021-01-08 00:52

    Slugify removes all leading spaces, you'll need to rewrite this as a custom template tag to get the behaviour you're after. The original filter code looks like this

    def slugify(value):
       """
       Normalizes string, converts to lowercase, removes non-alpha characters,
       and converts spaces to hyphens.
       """
       import unicodedata
       value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
       value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
       return mark_safe(re.sub('[-\s]+', '-', value))
    

    which changes "some   string" into "some-string" killing the extra whitespace. You could change it like so:

    def new_slugify(value):
       """
       Normalizes string, converts to lowercase, removes non-alpha characters,
       and converts spaces to hyphens, does not remove leading whitespace.
       """
       import unicodedata
       value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
       value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
       return mark_safe(re.sub('[-\s]', '-', value))
    

    Which will result in the following behaviour: "Some  String here" to "some--string-here"

    You still might have problems as mentioned before with how html treats extra whitespace, you'd have to write another, deslugify filter.

    0 讨论(0)
提交回复
热议问题