• Как сделать отправку данных на сайт getresponse?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    submit - автоматически отправляет тебя по ссылке заданной в форме. Отмени стандартное действие с помощью preventDefault и по событию, допустим success ответу - перенаправляй на нужную ссылку.
    $('.fixed-form-magnet form').on('submit', function(e){
    e.preventDefault();
    ...
    success...
    document.location.href = 'put_your_url_here';
    ...

    Hint: checkValidity() на поля формы на всяк случай)))
    Ответ написан
    Комментировать
  • Как сверстать подобный блок?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Создай 3 div, как колонки, задай им ширину и запихни туда нужные блоки. Удобнее - через flex или bootstrap.
    Если у тебя подключен bootstrap - структура такая:
    row
        col-4
            block-1-1
            block-1-2
            block-1-3
        col-4
            block-2
        col-4
            block-3-1
            block-3-2
            block-3-3
    Ответ написан
    Комментировать
  • Стоит ли продолжать учить Python для первой работы в СПБ?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Да там не в книжках дело, а в практике. Насчет java/python - решай сам. Что больше нравится и для каких задач будет применяться. Просто выбери специализацию и пиши что-нибудь для себя. Возможно бери заказы на фрилансе больше для опыта, чем для денег. Насчет python фреймворка для веба - однозначно django. 1-3 средне-мелких проекта на фрилансе - и тебя спокойно возьмут на высокооплачиваемую работу. По Java - я 0)))
    Ответ написан
    Комментировать
  • Как создать thumbnail pillow image после сохранения в модели django?

    @gh0sty Автор вопроса
    Веб-разработчик. Пишу под Python Django.
    7 долбанных часов...
    Это было дико, мать твою!


    Подробности (не ручаюсь за инфу, мейби говнокодеры с форумов пишут вслепую):
    1. Значт так, в какой-то версии Django метод super save стал break-ать метод save модели
    2. В какой-то еще версии Django запретили создавать папки изменением self.image.name. Но разрешили в upload_to закидывать функцию с неявными (встроенными) аргументами без возможности добавления (!)
    3. Решил не париться save и post_save - просто создал внутренний метод и вызываю его перед super save.


    Це мой идеальный модельный код:
    def get_path_upload_image(instance, filename):
        """
        Переопределение имени и путя фотографии, сокращение названия
        В следующий формат: (media)/photos/username/2019-08-20/photo-name_23-59-59.extension
        """
        if '/' in filename:
            filename = filename.split('/')[-1]
        img_header, img_extension = os.path.splitext(filename)
        if len(img_header) > 30:
            if img_header[-6:] == '_thumb':
                img_header = img_header[:30] + '_thumb'
            else:
                img_header = img_header[:30]
        time = timezone.now().strftime('%Y-%m-%d')
        img_name = img_header + '_' + time + img_extension
        path = os.path.join('photos', '{}', '{}', '{}').format(instance.user.username, time, img_name)
        return path
    
    
    class Photo(models.Model):
        """ Фото """
        user = models.ForeignKey(User, verbose_name='Пользователь', on_delete=models.CASCADE)
        name = models.CharField('Имя', max_length=50)
        image = models.ImageField('Фото', upload_to=get_path_upload_image, blank=True, null=True)
        thumbnail = models.ImageField('Превью', upload_to=get_path_upload_image, editable=False, blank=True, null=True)
        order = models.PositiveSmallIntegerField('Порядковый номер', null=True, blank=True)
        is_main = models.BooleanField('Главное', default=False)
        created = models.DateTimeField('Дата создания', auto_now_add=True)
        slug = models.SlugField('url', max_length=50, unique=True)
    
        def __str__(self):
            return self.name
    
        class Meta:
            verbose_name = 'Изображение'
            verbose_name_plural = 'Изображения'
    
        def save(self, *args, **kwargs):
            self.make_thumbnail()
            super(Photo, self).save(*args, **kwargs)
    
        def make_thumbnail(self):
            image = Image.open(self.image)
            image.thumbnail((120, 80), Image.ANTIALIAS)  # ваш размер thumbnail
            thumb_name, thumb_extension = os.path.splitext(self.image.name)
            thumb_filename = thumb_name + '_thumb' + thumb_extension
            temp_thumb = BytesIO()
            image.save(temp_thumb, 'JPEG')
            temp_thumb.seek(0)
            self.thumbnail.save(thumb_filename, ContentFile(temp_thumb.read()), save=False)
            temp_thumb.close()


    Це мой views:
    ph = Photo(user=profile.user, order=request.POST.get('files_uploaded'))
    im = Image.open(photo_upload_form.cleaned_data['image'])
    im = im.convert('RGB')
    blob = BytesIO()
    if im.width > 1920 or im.height > 1080:
        output_size = (1920, 1080)
        im.thumbnail(output_size)
        im.save(blob, 'JPEG', quality=100)
    ph_name = 'gallery{}-{}.jpg'.format(gal.id, timezone.now().strftime('%Y-%m-%d-%H-%M-%S'))
    ph.name = ph_name
    ph.slug = slugify(ph_name)
    ph.image.save(ph_name, File(blob), save=False)
    ph.save()


    Если че - он сжимает полученное изображение до 1920x1080, закидывает его в photo и автоматически генерит thumbnail - да еще и генерируя путь в зависимости от даты и username.
    Ответ написан
    1 комментарий
  • Как реализовать асинхронный js после цикла?

    @gh0sty Автор вопроса
    Веб-разработчик. Пишу под Python Django.
    Спасибо, Алексей Ярков !
    Проблема скорее всего была в пересоздании инпута и повторном вызове change.
    Т.к. не удавалось сделать промис - сначала создавался новый input, а потом повторно заменялся превьюхой.
    (просто тупил XD)
    Сделал через before.
    Це код:

    var files_uploaded = 0;
    $("#add-image").on("change", function(e) {
        var files = e.target.files,
        filesLength = files.length;
        for (var i = 0; i < filesLength; i++) {
            var f = files[i];
            var fileReader = new FileReader();
            fileReader.onload = (function(e) {
                var file = e.target;
                var upl = $('#all-images .upload-image').parent(); //col с загрузчиком (все объекты в col обернуты)
                upl.css('display', 'none');
                files_uploaded += 1;
                var new_img = '<div class="col-12 col-md-6 col-lg-4 mb-3" style="height: 150px; display: none"><div class="uploaded-img"><span class="image-number customized customized-border-color">' + files_uploaded + '</span><i class="fas fa-times remove-image customized-color-h"></i><img src="' + file.result + '"/></div></div>';
                upl.before(new_img); //вставить перед загрузчиком
                $('#all-images .upload-image span').text(files_uploaded+1); //меняем циферку
                upl.prev().fadeIn(); //для красоты
                upl.fadeIn();
            });
            fileReader.readAsDataURL(f);
        }
    });
    Ответ написан
  • Как исправить ошибку "Uncaught TypeError: Cannot read property 'style' of undefined" в jQuery DataTables?

    @gh0sty Автор вопроса
    Веб-разработчик. Пишу под Python Django.
    Нашел решение. Как оказалось нельзя использовать colspan, если у тебя нет, как минимум, 2х строк thead, т.е. colspan применим только к complex header.
    Фикс:
    ...
    <thead class="bg text-white font-weight-bold">
        <tr class="d-none">
            <th></th>
            <th></th>
            <th></th>
            <th class="d-none d-md-table-cell"></th>
            <th></th>
            <th></th>
        </tr>
        <tr>
            <th colspan="3">Объявление</th>
            <th class="d-none d-md-table-cell" data-toggle="tooltip" data-placement="top" title="Сортировать">Дата</th>
            <th data-toggle="tooltip" data-placement="top" title="Сортировать">Статус</th>
            <th data-toggle="tooltip" data-placement="top" title="Сортировать">Цена</th>
        </tr>
    </thead>
    ...

    и еще 1 параметр к инициализации DataTable:
    columnDefs: [
        { orderable: false, targets: [ 0, 1, 2 ] }
    ]


    Пасибки WhiteBearDev, хоть я и не въехал сразу.
    Ответ написан
    Комментировать
  • Django - как сохранить выбор одного значения из нескольких в переменную в шаблоне html и использовать ее в дальнейшем?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Во первых, сделай какую-нибудь валюту основной. Чтобы не парится с перерасчетами.
    Во вторых, передавай в темплейт (через контекст) свои коэффициенты + базовую валюту.
    В третьих, сделай изменения визуальными через JS.
    Например, по клику на валюту изменяй цены:
    var price = {{price}};
    var usd_to_eur = {{coeff.usd_to_eur}};
    var usd_to_btc = {{coeff.usd_to_btc}};
    $('#eur_btn').on('click', function () {
        var new_price = price * usd_to_eur;
        $('#price').text(new_price);
    });
    ...

    В четвертых, если это форма, до добавь hidden input с ценой в USD.

    Если хочешь проще - передавай в темплейте (в контексте) уже готовые цены и просто меняй по клику.

    Теперь о сессиях и выборе валюты.
    По клику на валюту (также) передавай ajax-запрос на выделенный урл и сохраняй в сессии

    Если что - будет выглядеть как-то так:
    $('#eur_btn').on('click', function () {
        $.ajax({
            url : "/valutes/eur/",
            type : "post",
            data : $('#hidden-input-form').serialize()
        });
    });
    ...

    Где #hidden-input-form форма, метода post, состоящая только из hidden input "valute". Крч, невидимая форма с твоими долларами и пр. Не забудь про csrf_token!
    Ответ написан
    Комментировать
  • Как реализовать динамический title?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    1 страница - 1 title. Иначе - никак.
    Если очень сильно надо - создай 2 идентичные страницы, но это очень глупое решение.
    Оптимально - написать эти страницы специализированно (т.е. различающиеся).
    Если ты это из-за сео - то есть еще тег description, по нему ищут поисковики, или в title несколько ключевых слов.
    Ответ написан
    3 комментария
  • Сайты с анимированным header?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Скорее всего речь о position: sticky.
    Вот ссыль, там +- подробно.
    Ответ написан
  • Проблема с обратной связью, как исправить?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Я в Пыхе не шарю, но, мне кажется, проблема из-за экранирования пробела или регистра в post запросе.
    Попробуй
    <textarea rows="5" name="mess" placeholder="Сообщение"></textarea>

    и
    $message = $_POST['mess'];
    Ответ написан
    1 комментарий
  • Как добавить очередность выполнения для prompt и append?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Шаг 1. Создай EventListener для кнопки, или ссылки, или клика, или события завершения ввода.
    Шаг 2. Вытворяй внутри все, что захочешь.
    Подробное описание.
    Скорее всего, ты говоришь о формах, тогда тебе потребуется submit событие.
    Ответ написан
    Комментировать
  • Сделать фон в секции?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    В стилях для нужного класса пиши:
    .your-class {
        background-image: url(path/to/image.jpg);
        background-size: cover;
    }
    Ответ написан
    Комментировать
  • Как на JS повторно вызывать функцию без перезагрузки страницы?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Функции многоразовые.
    Вызов функции - обращение вида generateChars();
    Добавляешь какое-то событие и привязываешь вызов функции:
    document.getElementById('button').addEventListener('click', function() {
        generateChars();
    })

    Тут по клику на элементом с id 'button'.
    Ответ написан
    5 комментариев
  • Как перейти на следующею итерацию?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    Тебе тип нужна пагинация на каждые 500 элементов? Первую функцию не понимаю, когда происходит return - функция завершает свою работу и код ниже не обрабатывается. Для скипа текущей итерации цикла пишется:
    for i in range(your_range):
        if (your_if):
            continue
        #your actions

    Если я правильно понял (а это трудно), ты хочешь искусственно проверить по счетчику прошло ли 500 и начать новую? Тогда код будет такой:
    import math
    
    your_data = [] # твой большой массив
    new_data = [] # результирующий массив
    paginate_by = 500 # по сколько в 1 массивчике
    iters = math.ceil(len(your_data)/paginate_by) # Округление вверх 2.3 --> 3
    for i in range(iters):
        paginated_data = your_data[(paginate_by*i):(paginate_by*(i+1))] #  срез массива, допустим i = 2, то элементы с индексом от 1000 до 1499 (включительно)
        new_data.append(paginated_data)

    Или короче + твоя функция:
    import math
    def grouper(values, n, fillvalue=None):
        return [values[n*i:n*(i+1)] for i in range(math.ceil(len(values)/n))]

    Результат с передачей массива из 10 '1', и пагинацией по 3:
    data = ['1']*10
    x = 3
    print(grouper(data, x))
    # Вывод: [['1', '1', '1'], ['1', '1', '1'], ['1', '1', '1'], ['1']]
    # Или print(grouper(['1']*10, 3))
    Ответ написан
    2 комментария
  • Как правильно подключить Slick Slider к данному типу слайдера?

    @gh0sty
    Веб-разработчик. Пишу под Python Django.
    У тебя на codepen не подключен slick.
    На опыте скажу, slick-slider - вещь очень гибкая и работает исключительно с блоками.
    Т.е. ты верстаешь отдельный слайд как блок и кидаешь его в слик.
    Нету никакого content и img (как я знаю).
    Примерно так все должно выглядеть:
    <div class="slider-name" style="width: 100%; height: 800px">
        <!-- cover - растянуть изображение, сохраняя пропорции, но с обрезанием -->
        <div style="width: 100%; height: 100%; background-image: url(path/to/image1.jpg); background-size: cover">
            Данные первого слайда
        </div>
        <div style="width: 100%; height: 100%; background-image: url(path/to/image2.jpg); background-size: cover">
            Данные второго слайда
        </div>
        <div style="width: 100%; height: 100%; background-image: url(path/to/image3.jpg); background-size: cover">
            Данные третьего слайда
        </div>
    </div>
    Ответ написан
    3 комментария