• На чем сделать макет сайта для доисторических компов?

    @mletov
    Как вариант, верстать на таблицах и с распорками из прозрачного gif, как делали в начале 2000-х
    Ответ написан
    Комментировать
  • Какой порядок обучения веб-верстке вы посоветуете?

    theobroma
    @theobroma
    javascript developer (ReactJS)
    Здесь проблема даже не SASS, Bootstrap и т.д., а "телеги впереди лошади". Невозможно понять предназначение инструментов не столкнувшись с проблемой, которую они решают! Нельзя понять зачем бензопила если есть ножовка по дереву, пока не начнешь пилить определенные объемы древесины! Да бензопила сложней в понимании и обращении, но ее освоение стоит того...
    Вернемся к Вебу. У меня, к примеру, быстро возникло ощущение, что чего-то не хватает в самом CSS и я начал смотреть на препроцессоры. Вам нужно просто продолжать верстать макеты. Через боль со временем начнут проявляться проблемы и возникнет желание что-то ускорить, что-то упростить. Тогда и начинают искать инструменты для этого.
    Препроцессоры
    1. Сложность будет увеличиваться и захочется, например, писать все для удобства не в одном файла . Тогда станет ясно для чего импорты препроцессоров(нативный импорт CSS лучше не использовать).
    2. Обычно в макете несколько цветов, которые повторяются во многих местах. Их можно присвоить в понятные переменные типа $my-green или $my-orange, которые легко запомнить и не искать hex значения. "$my-orange" проще запомнить чем "#FF8C00", не так ли?
    3. В макете размеры в пикселях, а нужно верстать в em и rem. На этот случай есть конечно лайфхак с 10px в основе вместо 16px, но миксины по конвертации на все случаи жизни. То есть можно применить "em(18)" и 18px скомпилятся в "1,125em" и не нужен калькулятор.
    Не стоить пытаться применить все возможности какой-то технологии сразу. Время придет для всего, но сначала используйте, что считаете нужным именно в данный момент. Попробуйте SASS на уровне "переменные, миксины, нестингы". Это уже будет норм. Рекомендую максимально просто это сделать c gulp и gulp-sass. Чисто для компиляции SASS и без всего остального, пока не созреете на большее.
    Boostrap
    Не стоить учится верстать с бутстрапом. В нем можно подсмотреть как реализована та или иная штука, просто вдохновиться, посмотреть на компоненты, которые вообще могут быть. Но применять его лучше, когда уже верстать не хочется))) А это будет, когда захочется использовать фрейморк для написания приложения. На что можно обратить внимание, так это что такое сетка(grid) и ее реализация. Вот онa используется много где.
    Начать ознакомление можно просто подключив через тэги c CDN . А потом уже можно устанавливать с NPM sass версию, кастомизировать и т.д.. Вообще приступая к изучению любой технологии нужно пытаться сгладить кривую обучения и не хвататься за все сразу.
    Javascript
    На счет JS лучше CodeWars не знаю ничего. Тут подробней отвечал. Потом нужно учить фронтэнд фрейморки, но это уже совсем другая история...
    Ответ написан
    1 комментарий
  • Как в Django передать данные из модели в шаблон в обход views?

    un1t
    @un1t
    Убедитесь что у вас реквест есть в контекст процессорах

    TEMPLATE_CONTEXT_PROCESSORS = (
      ...
      'django.core.context_processors.request',
    )

    И тогда можете прямо в шаблонах писать
    {{ request.user.username }}

    Если другие данные нужны, то в общем случае надо написать свой context processor или template tag.

    В render_to_response надо передовать RequestContext, но проще вместо render_to_response использовать функцию render, в нее нужно передавать request.
    Ответ написан
    Комментировать
  • Как в Django передать данные из модели в шаблон в обход views?

    @hsc
    full stack python back-end developer
    Для начала: https://www.python.org/dev/peps/pep-0020/
    Один из пунктов там "явное лучше неявного".

    Views в django на то и придуманы чтобы передавать данные и делать это явно, но то, как это сделать всецело зависит от Вас. Вы правы, нет смысла во всех вьюхах городить огород с передачей одних и тех же данных, тем более, если они общие для большинства шаблонов, но ни custom context processor, ни тем более custom template tag Вас не выручат так, как может одна простая конструкция:

    где-нибудь в utils.py
    def base_context(request):
        return Context({
            'user': request.user,
            '...': '...',
        })


    Где-нибудь в views.py:
    def view(request):
        context = base_context(request)
        context['this view specific data'] = 'happy coding'
        return render_to_response('template.html', context)


    Таким образом Вы:
    1. Не захламляете общий request flow и сохраняете контроль над контекстом любой вьюхи. Context processors будут вызваны для любого рендера, тогда как такой подход позволит Вам всегда иметь минимум необходимых данных под рукой и полный контроль над всеми вьюхами.

    2. Передаете в контекст шаблонизатора только, что действительно должно в него попасть. Больше того, в отдельных вьюхах Вы даже можете переопределить базовые параметры, что не так удобно делать с context processors. (но лучше см. п.3)

    3. Можете расширить абстракцию как угодно, и создать хоть 2, хоть 3, хоть больше базовых контекстов под всевозожные ситуации (зависит от архитектуры).
    Ответ написан
    Комментировать
  • Простой и эффективный способ подсчета просмотров страницы на django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Я бы сделал так:

    models.py
    class PageHit(models.Model):
        url = models.CharField(unique=True)
        count = models.PositiveIntegerField(default=0)

    decorators.py
    from functools import wraps
    from django.db.models import F
    from django.db import transaction
    
    def counted(f):
        @wraps(f)
        def decorator(request, *args, **kwargs):
            with transaction.atomic():
                counter, created = PageHit.objects.get_or_create(url=request.path)
                counter.count = F('count') + 1
                counter.save()
            return f(request, *args, **kwargs)
        return decorator

    views.py
    from .decorators import counted
    
    @counted
    def some_view(request):
        ...

    Репозиторий демонстрационного проекта.

    Или можно написать middleware, который будет делать то же самое для всех запросов.
    Ответ написан