diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index ddfc027e0..e8740d57b 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -856,8 +856,8 @@ class DocumentationRenderer(BaseRenderer): return { 'document': data, 'langs': self.languages, - 'lang_htmls': ["rest_framework/docs/langs/%s.html" % language for language in self.languages], - 'lang_intro_htmls': ["rest_framework/docs/langs/%s-intro.html" % language for language in self.languages], + 'lang_htmls': [f"rest_framework/docs/langs/{language}.html" for language in self.languages], + 'lang_intro_htmls': [f"rest_framework/docs/langs/{language}-intro.html" for language in self.languages], 'code_style': pygments_css(self.code_style), 'request': request } diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 10cd79227..48747e687 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -1375,7 +1375,7 @@ class ModelSerializer(Serializer): if not isinstance(read_only_fields, (list, tuple)): raise TypeError( 'The `read_only_fields` option must be a list or tuple. ' - 'Got %s.' % type(read_only_fields).__name__ + f'Got {type(read_only_fields).__name__}.' ) for field_name in read_only_fields: kwargs = extra_kwargs.get(field_name, {}) diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index 58f0d45c8..0dbaa196e 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -194,7 +194,7 @@ def add_class(value, css_class): return mark_safe(class_re.sub(match.group(1) + " " + css_class, html)) else: - return mark_safe(html.replace('>', ' class="%s">' % css_class, 1)) + return mark_safe(html.replace('>', f' class="{css_class}">', 1)) return value @@ -202,7 +202,7 @@ def add_class(value, css_class): def format_value(value): if getattr(value, 'is_hyperlink', False): name = str(value.obj) - return mark_safe('%s' % (value, escape(name))) + return mark_safe(f'{escape(name)}') if value is None or isinstance(value, bool): return mark_safe('%s' % {True: 'true', False: 'false', None: 'null'}[value]) elif isinstance(value, list): @@ -218,8 +218,8 @@ def format_value(value): return template.render(context) elif isinstance(value, str): if ( - (value.startswith('http:') or value.startswith('https:')) and not - re.search(r'\s', value) + (value.startswith('http:') or value.startswith('https:')) and not + re.search(r'\s', value) ): return mark_safe('{value}'.format(value=escape(value))) elif '@' in value and not re.search(r'\s', value):