Закрыть

Для эффективной работы на сайте используются cookie и обработка персональных данных. Пользуясь этим сайтом, вы соглашаетесь с правилами использования сайта. Подробнее

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

Невозможно — это всего лишь громкое слово, за которым прячутся маленькие люди. Им проще жить в привычном мире, чем найти в себе силы что-то изменить. Невозможное — это не факт. Это только мнение. Невозможное — это не приговор. Это вызов. Невозможное — это шанс проявить себя. Невозможное — это не навсегда. Невозможное возможно.

Мухаммед Али

Автоматический перевод в верхний регистр в CharField Django

8 июня 2016 г. 3:21

Простой и, возможно, нестандартный способ перевода значения поля CharField в верхний регистр без использования javascript. Суть в следующем: в модели переопределяем метод save(), преобразовывая значение нашего поля в верхний регистр, и добавления стиля полю text-transform: uppercase. Таким образом, мы всегда будем видеть, что введённые буквы заглавные, а переопределение даст нам возможность сохранить символы в верхнем регистре, которые мы можем использовать в шаблоне без повторного преобразования text-transform: uppercase.

А теперь наглядный пример. Допустим, у нас есть одежда, и её размер (M, S, L ...) должен записываться в верхнем регистре как мы привыкли видеть на лейблах одежды.

# models.py
class Product(models.Model):
    ...

class Size(models.Model):
    product = models.ForeignKey(Product, verbose_name='Товар', related_name='sizes')

    value = models.CharField('Размер', max_length=5)

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        self.value = self.value.upper()  # Переводим значение в верхний регистр
        return super(Size, self).save(force_insert, force_update, using, update_fields)
from my_app.models import Size
from my_app.forms import SizeForm

# admin.py
class SizeInline(admin.TabularInline):
    model = Size
    extra = 0
    form = SizeForm

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    inlines = (SizeInline, )
from my_app.models import Size


# forms.py
class SizeForm(forms.ModelForm):
    class Meta:
        model = Size
        exclude = ()
        widgets = {
            'value': forms.TextInput(attrs={'style': 'text-transform: uppercase'}),
        }

Данное решение избавляет нас от подключения js и css кода.

На самом деле есть много вариантов реализации данной задачи. Например, можно было, вообще, обойтись без переопределения save() и использования SizeForm - просто в шаблоне также использовать свойство text-transform: uppercase. Мне так не понравилось, потому что нужно было бы каждый раз при рендере страницы браузеру переводить надписи размеров в верхний регистр. Хоть это не затратная по ресурсам операция, но всё же.

Оцените статью

0 из 5 (всего 0 оценок)

Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

Автор статьи

Права на использование данной статьи, расположенной на настоящей странице http://vivazzi.ru/it/auto-upper-charfield/:

Разрешается копировать статью с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="http://vivazzi.ru/it/auto-upper-charfield/">http://vivazzi.ru/it/auto-upper-charfield/</a>

Подробнее: Правила использования сайта

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

Комментариев: 0

Вы можете оставить комментарий как незарегистрированный пользователь. Но, зарегистрировавшись, вы сможете получать оповещения об ответах, а также иметь доступ к своему личному аккаунту для просмотра своих комментариев.

Чтобы оставить комментарий от своего имени войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте