Задать вопрос
  • Как прописать дополнительный стиль?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Чтобы изменять отдельные стили, нужно добавить второй класс-"модификатор".
    Например, согласно БЭМу .
    Довольно полезная методология.
    Ответ написан
  • Как передать значение для формы в Django?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Уже писал, по идее -на почте должен быть более менее - полный ответ.
    Вариант 1:
    Использовать сессию.
    В AddClient сохранять id в нее
    client = form.save()
    request.session['client_id'] = client.id
    request.session.modified = True

    В AddOrder, сохранять форму с commit=False и добавлять id из сессии, после чего - удалять ключ из нее (также с ...modified = True)
    UPD: Нужно будет обновить модель, изменив FK и сделав его null/blank=True.
    Ну и проверять перед сохранением заказа, есть ли в сессии нужный ключ.
    Плюсы: можно продолжить редактирование, даже после создания юзера и закрытия браузера.
    Минусы: без дополнительной обработки (например - запрет на модификацию существующего в сессии ключа) может возникнуть случай когда юзер перезаписывается до создания заказа.
    Вариант 2:
    redirect(reverse('app:view', kwargs={ 'bar': FooBar })) # Id записывать в kwargs

    Плюсы: не возникнет указанной выше ситуации.
    Минусы: нужно модернизировать url
    Ответ написан
    Комментировать
  • Почему в админке не показывает аватары пользователей?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Потому-что не у всех юзеров есть аватар, и не указан по умолчанию.
    def get_us_avatar(self, obj):
            print(repr(obj.avatar))
            if obj.avatar:
                return mark_safe(f'<img src="{obj.avatar.url}" alt="" height="100px">')
            else:
                return mark_safe(f'<img src="" alt="">')

    P.S. Для хранения файлов пользователей стоит использовать папку media.
    И да - используйте генератор случайных имен, иначе в какой-то момент юзер загрузит картинку, название которой совпадает с названием уже загруженной.
    Ответ написан
    Комментировать
  • Проблема в создании эхо-бота для телеги на пайтоне, в чем причина?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Вы издеваетесь? Где правильный код?
    Где у вас на 4=й строке bot.reply_to?
    UPD. Хауди Хо и телегам-боты это конечно прекрасно и хорошо, но вы же не будете устраиваться на работу в ресторан, не умея готовить и посмотрев передачу про Гордона Рамзни? Что-то мне кажется, что нет. Тогда почему вы пытаетесь писать ботов на языке программирования, которого не знаете, посмотрев только видос попсового ютубера?
    Ответ написан
    1 комментарий
  • Как грамотно скрыть токен?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Сохранить его в переменную окружения heroku и вызывать через:
    os.environ['var_name']
    Ответ написан
    3 комментария
  • Какой сервис использовать для бесплатного хранения видео для бэкенда на Django?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Полагаю - таких, чтобы без лютых костылей и бесплатных одновременно - нет.
    Разве что у амзаона есть бесплатный тир на 5ГБ/12 месяцев
    P.S., как вариант - найти бесплатный хостинг и написать прослойку на php, которая обрабатывала бы запросы, но там обычно малый объем места и отсутствие сертификатов
    Ответ написан
  • Почему при запуске dev-сервера на 0.0.0.0, не появляется доступ из локальной сети?

    AlexNest
    @AlexNest Автор вопроса
    Работаю с Python/Django
    Помогло разрешить доступ python`у и/или возможно, открытие 8000 порта.
    Ответ написан
    Комментировать
  • Аутентификация с помощью Django Simple JWT или своя аутентификация пользователя?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Судя по тому, что вы спрашиваете - кастомная аутентификация вам не нужна.
    к тому-же:
    1. JWT - сейчас де-факто стандарт на рынке (по крайней мере - один из).
    2. Почему бы вам не потестить в "реальных условиях" и если окажется, что по каким-то причинам, не хватает возможностей (при условии, что текущие возможности использовались по максимуму, как на беке, так и на фронте), написать что-то свое.
    3. К вопросу о написании своего метода - в 95% случаев можно переопределить отдельные компоненты (к примеру - расширить payload access-токена).
    Ответ написан
    Комментировать
  • Как автоматизировать анкеты соискателей?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Насчет сервиса не знаю, но могу посоветовать использовать python.
    1. Библиотека для работы с акссессом
    2. Библиотека для работы с xcls файлами
    Да, придется немного разобраться с языком, но в остальном - достаточно "совместить" код из quickstart-гайдов - они процентов на 90 покрывают процессы с каждой из сторон - чтение из базы и запись файл.
    P.S. В коменты чуть позже скину некоторые советы.
    UPD:
    Набросал примерный скрипт с подробными комментариями.
    Если будут вопросы - пишите.
    spoiler
    import time
    from os import path
    import sqlite3 # Библиотека для работы с sqlite, не нужна
    import openpyxl
    # import pyodbc Установить библеотеку и раскоментить
    def fetch_all_rows():
    	"""
    		Функция, выбирающая данные из БД
    	"""
    	con = sqlite3.connect('db.sqlite3') # Подключение к базе данных, заменить на 
    										# conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Ron\Desktop\Test\test_database.accdb;')
    										# где C:\Users\Ron\Desktop\Test\test_database.accdb - путь до базы
    	cur = con.cursor()
    	cur.execute('select * from accounts_useraccount') # sql-запрос для выборки. Подставить свой для правильной выборки
    	users = cur.fetchall() # Запись полученных данных в переменную
    	cur.close() # Закрытие соединения
    	return users
    
    def generare_xcls_files(users):
    	user_set = users # получение юзеров
    	excel_file = openpyxl.load_workbook('template.xlsx') # Открытие шаблона, подставить свое имя
    
    	employees_sheet = excel_file['Карточка'] # Выбор активной таблицы, подставить свое имя
     
    	i = 1 # Переменная, в которую будет записываться номер цикла, нужно чисто для красивого имених xlsx файла
    	for user in users: # Цикл по всем данным
    		username = user[4] # Получение значение конкретного столбца таблицы. ВАЖНО - НУМИРАЦИЯ НАЧИНАЕТСЯ С 0 
    		email = user[7] # Т.Е. ЧТОБЫ ВЫБРАТЬ ЗНАЧЕНИЕ ИЗ СТОЛБЦА EMAIL, КОТОРЫЙ ЯВЛЯЕТСЯ 8 ПО СЧЕТУ В ТАБЛИЦЕ, НУЖНО УКАЗАТЬ 7
    
    		employees_sheet['B1'] = username #Запись полученного значения в конкретную ячейку
    		employees_sheet['B2'] = email
    
    
    		filename = f'{i}_{username}_{email}.xlsx' # Генерация имени файла, состоящего из нескольких значений (номер цикла и т.д.).
    		filename = path.join('files', filename) # Добавление к имени файла пути до папки files, в одном со скриптом каталоге. ВАЖНО - папку нужно создать вручную.
    		i+=1 # увеличение переменной на 1
    		excel_file.save(filename=filename) # cохранение нового файла
    
    if __name__ == '__main__':
    	users = fetch_all_rows() # Запуск функций
    	generare_xcls_files(users)
    Ответ написан
  • Как автоматически создавать запись в одной таблице, при создании записи в другой (Django models)?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    
    # method for updating
    @receiver(post_save, sender=Zakaz)
    def update_stock(sender, instance, **kwargs):
        # instance - созданный объект, к которому можно обратится 
        # Здесь создавать объект

    UPD: в первом комменте - детальный пример.
    Ответ написан
    3 комментария
  • Как исправить SyntaxError: positional argument follows keyword argument?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    0.Не пытаться писать ботов.
    1. Изучить, что такое аргументы, какие они бывают.
    2.Открыть гугл.переводчик, вставить текст ошибки и применить только-что полученные знания.
    Ответ написан
    7 комментариев
  • Как вытаскивать строки из базы данных исключая некоторые из них?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Не уверен насчёт sqlite, но в sql (как и в питоне) есть оператор in, проверяющий наличие в списке. В вашем случае должно быть какие-то так.
    where id not in (v1, v2... vn)
    Ответ написан
    1 комментарий
  • Как правильно настроить static в django?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Ну вы же сами указали УРЛ.
    STATIC_URL = '/static/'
    С другой стороны - пока Вы используете дев-сервер (manage.py runserver), в корневом урле нужно прописать.
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

    P.S.
    После команды "python manage.py collectstatic" файл favicon.svg копируется в:

    collectstatic нужно запускать когда проект готов, чтобы скопировать статику в папку, из которой ее будет раздавать nginx (ну или другой сервак, хотя это редкость)
    Ответ написан
    Комментировать
  • Что такое Middlewares в aiogram?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    В общем случае, Middlewares это прослойка, вызываемая автоматически, после request и перед обработкой его сервером. Может использоваться, например, для логгирования или добавления полезной нагрузки.
    Пример из доков, который добавляет в данные каждого сообщения значение счетчика
    from aiogram import BaseMiddleware
    from aiogram.types import Message
    
    
    class CounterMiddleware(BaseMiddleware):
        def __init__(self) -> None:
            self.counter = 0
    
        async def __call__(
            self,
            handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]],
            event: Message,
            data: Dict[str, Any]
        ) -> Any:
            self.counter += 1
            data['counter'] = self.counter
            return await handler(event, data)
    Ответ написан
    Комментировать
  • Как сделать многостраничный сайт и форму регистрации?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    1. Ну тут минимум 2 варианта:

    I. Юзер вводит логин/мыло, сервер генерирует новый пароль, сохраняет хеш в базу а чистую копию отсылает на почту.
    II. Юзер вводит логин/мыло, сервер генерирует ссылку по типу domain.com/reset_pasword?token=dfsfgesdfs34asd...., где значение token является хешем - зашифрованным при помощи md5 логином и timestamp`ом, который сохраняется в бд (например в таблицу restet_password_history со столбцами: user_id | hash | is_changed ). При переходе по такой ссылке сервер проверяет, есть ли в базе данный хеш и is_changed == false. Если да, то выводится форма для ввода пароля. После отправки в таблицу с юзером сохраняется хеш нового пароля, а is_changed записи меняется на true.
    P.S. Во втором варианте неплохо было бы сделать "срок жизни" такой ссылки, т.е. сохранить в указанной таблице текущие дату и время+час, к примеру, а при переходе по ссылке проверять текущее время.

    Это первое, что пришло в голову.
    2. Смотря что вы имеете в виду под многостраничностью - если простые страницы по типу "о нас/контакты/правила" то да, руками. А если динамические по типу профилей/статей, то для каждой типовой страницы создается шаблон, в который выводятся данные из БД.
    Ответ написан
    Комментировать
  • Как возможно отправить Embed сообщение в личные сообщения Discord?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    1. JSON это не скрипт, а формат хранения данных.
    2. Принцип точно такой-же, как и при отправке в канал сервера, с той лишь разницей, что нужно использовать другую команду.
    Ответ написан
  • Как сделать отправку сообщения Discord в определенное время?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Самый простой вариант через встроенный цикл. bg_task будет выполняться каждые n-единиц времени (в примере - каждую секунду, но для указанного вами условия этого излишне, можно, к примеру, каждые полминуты). Ну и в этой функции нужно проверять время и отправлять в соответствующий момент
    import asyncio
    import discord
    from discord.ext import commands
    from discord.ext.tasks import loop
    
    bot = commands.Bot(command_prefix = '!!')
    
    @loop(seconds=1)
    async def bg_task():
        pass # doing smth
    
    @bot.command()
    async def hi(ctx):
        await ctx.send('Hi!')
    
    bg_task.start()
    bot.run('************************')
    Ответ написан
  • Как связать две формы в Django?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Добавьте вторую также как и первую:
    article_form = AddLectureForm()
            content_form = AddContentForm()
    
        context = {
            'article_form ': article_form,
            'content_form ': content_form 
        }
        return render(request, 'main/render.html', context)

    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form_one.as_p }}
        {{ form_two.as_p }}
        <input type="submit" value="ok">
    </form>


    Конкретно, это чисто пример вывода форм. Обрабатывать две формы нужно также как и одну, только после сохранения первой из нее нужно получить id и передать во вторую.
    P.S.:
    Конкретно может помочь раздел про метод save()
    В коментах несколько моментов относительно текущей реализации.
    Ответ написан
  • Не могу сделать миграцию, как это решить?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Для начала - перевести ошибку.
    Ответ написан
    Комментировать
  • Зачем с гитхаба проекты заливают на нетлифай, хероку и прочие?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    На heroku и иже с ними обычно заливают проекты с серверной частью или программы косвенно связанные с вебом. У меня, например, там с дипломки висит сайт на Django (фреймворк на питоне) и дискорд-бот.
    Github pages же предназначен для "статичных" сайтов - одностраничников\лендингов\состоящих из пары страниц, с небольшим количеством JS.
    Ответ написан