Задать вопрос
tox: E25E9448010D638829D99B040A69765F00D5699626E47D604C6149F05A140919B1E76FB56071

Достижения

Все достижения (7)

Наибольший вклад в теги

Все теги (37)

Лучшие ответы пользователя

Все ответы (125)
  • Как обуздать Django messages?

    winordie
    @winordie
    Лучшая документация -- исходники
    Давайте посмотрим как работает framework messages.

    https://github.com/django/django/blob/master/djang...
    def messages(request):
        return {
            'messages': get_messages(request),
            'DEFAULT_MESSAGE_LEVELS': DEFAULT_LEVELS,
        }
    ...
    def get_messages(request):
        if hasattr(request, '_messages'):
            return request._messages
        else:
            return []

    Так messages попадают на страницу. Т.е. они берутся из request._messages. Как же они туда попадают?

    https://github.com/django/django/blob/master/djang...
    class MessageMiddleware(MiddlewareMixin):
        def process_request(self, request):
            request._messages = default_storage(request)
    ...
    def default_storage(request):
        return import_string(settings.MESSAGE_STORAGE)(request)
    ...
    MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'

    Значит в request._messages у нас лежит FallbackStorage(request)

    Перейдем к нашему коду
    messages.error(request, 'Ваш диапазон дат занят для данного объекта.')

    Что тут происходит? Посмотрим:
    https://github.com/django/django/blob/master/djang...
    def error(request, message, extra_tags='', fail_silently=False):
        add_message(request, constants.ERROR, message, extra_tags=extra_tags,
                    fail_silently=fail_silently)
    ...
    def add_message(request, level, message, extra_tags='', fail_silently=False):
        if not isinstance(request, HttpRequest):
            raise TypeError("add_message() argument must be an HttpRequest object, "
                            "not '%s'." % request.__class__.__name__)
        if hasattr(request, '_messages'):
            return request._messages.add(level, message, extra_tags)  # *** THIS ***
        if not fail_silently:
            raise MessageFailure('You cannot add messages without installing '
                        'django.contrib.messages.middleware.MessageMiddleware')

    Ага, вызывается метод add знакомого нам объекта FallbackStorage.
    Ему передается в качестве параметров:
    - level = constants.ERROR = 40
    - message = 'Ваш диапазон дат занят для данного объекта.'
    - extra_tags = ''

    Посмотрим на этот метод
    https://github.com/django/django/blob/master/djang...
    def add(self, level, message, extra_tags=''):
            if not message:
                return
            level = int(level)
            if level < self.level:
                return
            # Add the message.
            self.added_new = True
            message = Message(level, message, extra_tags=extra_tags)
            self._queued_messages.append(message)
    ...
    def _get_level(self):
            if not hasattr(self, '_level'):
                self._level = getattr(settings, 'MESSAGE_LEVEL', constants.INFO)
            return self._level

    Из этого кода можно сделать вывод что сообщение попадает в очередь сообщений если его уровень более или равен тому который задан в settings.MESSAGE_LEVEL (по умолчанию = contants.INFO = 20)

    Таким образом чтобы добавлялись только наши сообщения необходимо:
    1) в settings.py установить
    # settings.py
    ...
    MY_SUPER_ERROR = 80
    MESSAGE_LEVEL = MY_SUPER_ERROR
    ...

    2) Во вью писать
    if not available_cars:
            carstoshow = None
            messages.add_message(request, settings.MY_SUPER_ERROR, 'Ваш диапазон дат занят для данного объекта.')
            return redirect('car_detail', pk=car_used_id)
    Ответ написан
    1 комментарий
  • Как написать консольную программу?

    winordie
    @winordie
    Лучшая документация -- исходники
    Комментировать
  • Каков алгоритм и суть работы реально существующего скрипта 100% предсказания результата, загаданного человеком?

    winordie
    @winordie
    Лучшая документация -- исходники
    Трюк чтобы произвести впечатление на девушку при знакомстве:

    1) Говоришь что ты эксрасенс и умеешь читать мысли.
    2) Просишь ее загадать число от 1 до 100.
    3) Дальше в силу вступают твои актерские навыки, о том как себя ведут экстрасенсы можно узнать из многих фильмов или передач.
    4) Называешь рандомное число.
    5) Profit!!!

    PS сработает, конечно, с одной из ста, зато какой эффект
    Ответ написан
    Комментировать
  • Как вывести из модели связи с Foreign Key?

    winordie
    @winordie
    Лучшая документация -- исходники
    Snachala nado opredelit related_name dlya Vospitately.vospet_crushek
    class Vospitately(models.Model):
        fio = models.CharField(max_length=40)
        dolshnost = models.CharField(max_length=80, default='Должность..')
        image = models.ImageField()
        vospet_crushek = models.ForeignKey(Cruski', related_name='vospitately')
        def __str__(self):
            return self.fio

    Potom vo view mogno tak sdelat
    def kruzhki(request):
        q = Cruski.objects.all()
        return render(request,'krushki.html',{'kruzki':q})

    I nakonec v shablone pishem chto to po tipu takogo
    {% block kruzhki %}
    {% for krug in kruzki %}
    <p><b>{{ krug.name }}</b></p>
    {% for vospet in krug.vospitately.all %}
    <p> {{ vospet.fio }}</p>
    {% endfor %}
    <p>{{ krug.description }}</p>
    <p>{{ krug.price }}</p>
    {% endfor %}

    Vot i vse. Takim obrazom u nas vivoditsya krugki i vospitately kotorie v nis sostoyat.

    Kstati vam bi opredelitsya stoit kak pisat "кружки":
    - Cruski
    - vospet_crushek
    - kruzhki
    - kruzki
    - krushki.html
    Ответ написан
    3 комментария
  • На какой версии Django вы пишете для себя, а на какой аутсорс, работа, принуждение?

    winordie
    @winordie
    Лучшая документация -- исходники
    1. Для себя и не только себя пытаюсь писать на последней стабильной.
    2. Зависит от зависимостей. Некоторые батарейки могут еще не перейти на новую версию. Здесь как с python3.
    3. Старые интересные проекты для себя по возможности пытаюсь переводить на новую версию. Чужые -- зависит от заказчика.
    4. Что значит отказываться от проектов на версии старее 1.7? Отказываться от их поддержки -- нет. Писать на них -- так выбор версии от тебя зависит, сомневаюсь что заказчик будет просить проект на определенной версии.
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (7)