Ответы пользователя по тегу Django
  • Как расширить User используя Django REST?

    @deliro
    Ответ написан
    Комментировать
  • Как задать каждому полю отдельный класс?

    @deliro
    Я пока неопытный и учусь, поэтому не судите строго.

    По-моему, как раз, когда ты неопытный, судить нужно максимально строго, чтобы выправить руки в нужное русло как можно быстрее. А если ты от критики расстроишься и бросишь это всё - ну и ладно, меньше конкуренция.

    Я уже сто раз тут это писал и ещё напишу, пока будет эта жесть.
    Вот создал ты модель вакансий. Ты моделью описываешь единичную сущность, а назвал Vacancies - множественным числом.
    Дальше: вот у тебя есть модель вакансий. Зачем ты каждому полю даёшь имя, дублирующее имя модели? (Я про vac_*). Создал ты вакансию, да:
    vacancy = Vacancy.objects.create(...)
    И пошёл получать атрибуты:
    vacancy.vac_name # Красиво, п****ц, да?

    Сокращённые названия атрибутов - красота. Через полгода ты понятия не будешь иметь, что за vac_zan, vac_usl, vac_cat. А человек, который будет с тобой работать в команде или рефакторить это после тебя получит отличный набор головоломок в подарок к коду.

    Просто шикарные хитросплетения русского и английского языков. Твой код отражает твою многогранность и неповторимость. Ты - полиглот. Так ты думаешь, когда городишь эту ахинею?

    Я, к сожалению, прямо сейчас занят рефакторингом подобного кода и первые два дня я плакал над этим кодом и отказывался за него садиться. Заказчик уговорил с условием, что я полностью переписываю ту жесть.

    Ответ на вопрос: https://pypi.python.org/pypi/django-widget-tweaks
    Ответ написан
    1 комментарий
  • Как вывести последние 3 объекта в Django?

    @deliro
    Mention.objects.filter(mentionn_id=step_id).order_by('-pk')[:3]

    Где в order_by ты кладёшь поле с минусом (по убыванию), по которому нужно эти самые последние выбрать. pk - это алиас к primary key. Если ты его не менял - это ID.

    Bojczuk:
    If no such ordering is defined for a given QuerySet, calling reverse() on it has no real effect
    Ответ написан
    2 комментария
  • Развернуть сайт Django 1.9?

    @deliro
    nginx на фронт 100% (не апач)
    WSGI сервер выбирай из uWSGI и Gunicorn

    В общем получается так:
    nginx <-> uWSGI <-> Твоё приложение
    Статику отдаёт nginx напрямую.

    На русском можешь почитать учебник по английскому.
    Почти все актуальные доки только по-английски.
    Ответ написан
    1 комментарий
  • Как работать с permissions в Django?

    @deliro
    from django.contrib.auth.models import Permission, Group
    from django.contrib.contenttypes.models import ContentType
    
    content_type = ContentType.objects.get_for_model(YourModel)
    my_permission = Permission.objects.create(codename='your_permission', 
                                              name='Can access something', 
                                              content_type=content_type)
    my_group = Group.objects.create(name='My Group')
    my_group.permissions = [my_permission]
    user.groups.add(my_group)
    user.has_perm('app_label.your_permission')  # True

    Не понимаю только, зачем тут группа, если пермишены можно добавлять напрямую юзеру. Индивидуально.
    Ответ написан
    3 комментария
  • Как в Django1.9 настроить подключение к базе данных?

    @deliro
    1) Поставь линукс. Хотя бы в виртуалке.
    2) Postgres лучше MySQL.
    3) pymysql + install as mysqldb работает, если ты не прислушался к 2)
    Ответ написан
    4 комментария
  • Как запустить скрипта на python из модели django?

    @deliro
    os.system или subprocess
    Но делать так не надо. С вероятностью 99.9% у тебя с архитектурой проблемы, если понадобилось вызывать не программу, а python скрипт.
    Ответ написан
    3 комментария
  • Как обновить состояние юзера в Django?

    @deliro
    Если есть только два состояния юзера:
    1) Юзер не имеет доступа к платному контенту
    2) Юзер имеет доступ к платному контенту

    То такой вариант норм. Я бы добавил datetime nullable поле paid_till (проплачено до [если, конечно, есть некая подписка]) и создал метод
    def is_paid(self):
        if self.paid_till is None:
            return False
        return self.paid_till >= timezone.now()

    И им проверял бы, есть подписка у юзера или нет.
    Ответ написан
  • Разделение прав пользователей?

    @deliro
    Используй стандартные permission'ы. Для добавления/редактирования/удаления они автоматически создаются.
    Ответ написан
    Комментировать
  • Основное понятие по virtdev в Django?

    @deliro
    Вот будет у тебя два сайта на одном сервере. Один старый с django 1.6, другой новый с 1.9. И оба на Python3. Понимаешь?
    Ответ написан
    4 комментария
  • Как написать свой декоратор в django?

    @deliro
    Для начала, расширь модель юзера, чтобы не костылить всякими там таблицами typeUser:
    1) В основном app'е (у меня это обычно core) создай модель User, унаследованную от AbstractUser:
    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    # Это лучше перенести в отдельный файл consts.py
    USER_ADMIN = 'adm'
    USER_MANAGER = 'mng'
    USER_VASYA = 'vas'
    
    USER_TYPES = (
        (USER_ADMIN, 'Администратор'),
        (USER_MANAGER, 'Менеджер'),
        (USER_VASYA, 'Вася'),
    )
    
    
    class User(AbstractUser):
        type = models.CharField(max_length=3, choices=USER_TYPES)
    
        class Meta(AbstractUser.Meta):
            swappable = 'AUTH_USER_MODEL'

    2) В settings.py добавить:
    AUTH_USER_MODEL = 'core.User' # Где core - твой app

    3) makemigrations и migrate

    Если ещё не добрался до Class Based Views, то самое время.
    Делаешь такой, например, миксин:
    from django.core.exceptions import PermissionDenied
    # тут импорт USER_VASYA
    
    class VasyaRequiredMixin(object):
        def dispatch(self, request, *args, **kwargs):
            if request.user.type != USER_VASYA:
                raise PermissionDenied
            return super(VasyaRequiredMixin, self).dispatch(request, *args, **kwargs)


    И все вьюхи, которые доступны только Васе наследуешь ещё и от этого миксина, например так:
    class VasyaView(VasyaRequiredMixin, View):
        def get(self, request, *args, **kwargs):
            return HttpResponse('Vasya molodec')
    Ответ написан
    1 комментарий
  • Почему админка не открывается?

    @deliro
    1) Что значит "не открывается"? На скрине только конфиг урлов. Что из него можно понять на тему "не открывается"?
    2) Советую в регулярке с robots.txt добавить обратный слэш перед точкой, иначе можно будет попасть на robots.txt, введя robotsatxt или robotsqtxt.
    Ответ написан
  • Как избежать ошибки при установке модуля?

    @deliro
    Установить pymysql и в __init__.py проекта прописать
    import pymysql
    pymysql.install_as_MySQLdb()
    Ответ написан
  • Как создать страницу статических настроек для сайта в админке Django?

    @deliro
    from datetime import timedelta
    
    from django.db import models
    from django.utils import timezone
    
    
    class Settings(models.Model):
        """
        Модель настроек с интерфейсом атрибутов
    
        >>> settings.hello = 'world'
        Сохранит модель с key='hello' и value='world'. Если модель с таким ключом до этого
        существовала (т.е. в данный момент мы меняем значение), запись в БД поменяется и кэш
        инвалидируется.
    
        >>> settings.hello
        'world'
        Получение ключа. Сначала ищет в кэше. Если находит - возвращает, если нет,
        ищет в БД запись с таким ключом (hello). Если находит - кладёт в кэш и возвращает.
    
        >>> del settings.hello
        Удаляет запись с ключом hello из БД и кэша.
        
        Также, ключ и значение можно редактировать из админки (кэш в этом случает также
        инвалидируется)
    
        Пример куска вьюхи, которая может редактировать настройки сайта:
        if form.is_valid():
            settings.phone = form.cleaned_data['phone']
            settings.address = form.cleaned_data['address']
        """
        key = models.CharField(max_length=255, primary_key=True)
        value = models.TextField()
    
        __cache_ttl = 60 * 60
        __cache = {}
        __cache_max_size = 300
    
        def save(self, *args, **kwargs):
            super(Settings, self).save(*args, **kwargs)
            self._cache_invalidate(self.key)
    
        def __setattr__(self, key, value):
            cls = type(self)
            try:
                instance = cls.objects.get(key=key)
                instance.value = value
                instance.save()
            except cls.DoesNotExist:
                cls.objects.create(key=key, value=value)
            self._cache_invalidate(key)
    
    
        def __getattr__(self, key):
            value = self._cache_get(key)
            if value is None:
                cls = type(self)
                try:
                    value = cls.objects.get(key=key).value
                    self._cache_set(key, value)
                except cls.DoesNotExist:
                    value = None 
            return value
    
        def __delattr__(self, key):
            type(self).objects.filter(key=key).delete()
            self._cache_invalidate(key)
    
        def _cache_set(self, key, value):
            if len(self.__cache) < self.__cache_max_size:
                self._cache_force_set(key, value)
            else:
                self._cache_remove_old()
                if len(self.__cache) < self.__cache_max_size:
                    self._cache_force_set(key, value)
    
        def _cache_force_set(self, key, value):
            self.__cache[key] = (
                value,
                timezone.now() + timedelta(seconds=self.__cache_ttl)
            )
    
        def _cache_get(self, key):
            result = self.__cache.get(key)
            if result[1] > timezone.now():
                self._cache_invalidate(key)
                return None
            return result[0]
    
        def _cache_invalidate(self, key):
            del self.__cache[key]
    
        def _cache_remove_old(self):
            now = timezone.now()
            for k, v in self.__cache.items():
                if v[1] < now:
                    self._cache_invalidate(k)
    
    settings = Settings()


    И в контекст процессоры добавить:

    def settings(request):
        return {'settings': settings}


    Ну и в любом шаблоне:
    <title>{{ settings.title }}</title>
    Ответ написан
    7 комментариев
  • Как определить устройство делающее запрос к django?

    @deliro
    1) Можно попробовать определять, основываясь на request.META. Это вероятностный метод, 100%-го метода нет!
    2) Бэкенд не должен заботиться о платформе и отдавать разный контент.
    Ответ написан
    9 комментариев
  • Возможно ли написать абстрактную функцию фильтрации по HStoreField?

    @deliro
    from functools import reduce
    
    class Product(Model):
        attributes = HStoreField()
    
        @classmethod
        def filter(cls, data):
            return reduce(
                lambda qs, x: qs.filter(attributes__contains={x[0]: x[1]}), 
                data.items(), cls.objects.all()
            )

    Так что ли?
    Ответ написан
    Комментировать
  • Как сделать 2 факторную регистрацию?

    @deliro
    Там писанины-то на 5 минут. Создаёшь модель с тремя полями: юзер (FK), какой-нибудь хэш чего-нибудь (да хоть рандомной строки), время создания (auto_now_add). При регистрации генеришь эту модельку а при переходе по ссылке даёшь юзеру is_active=True. Создаёшь management команду, пуская раз в сутки по крону, которая будет вычищать юзеров (и эту новую модель), которые так и не активировали, допустим, за 3 дня аккаунт. Не забудь unique=True повесить на юзера и на хэш.
    Ответ написан
    5 комментариев
  • Вопрос про syncdb?

    @deliro
    db_table, для меня так удобно.

    Я бы бил по рукам таких

    python manage.py syncdb

    Django 1.8

    makemigrations -> migrate
    Ответ написан
    7 комментариев
  • Где скачать mod_wsgi для windows?

    @deliro
    Гайд на мильён для виндовсов:
    1) Ставишь VirtualBox
    2) Качаешь Ubuntu Server
    3) Ставишь одно на другое
    4) Ставишь nginx туда, openssh-server запускаешь, gunicorn или uWSGI настраиваешь
    5) Удивляешься, зачем ты столько времени потратил, если сервер разработки включается через runserver, а продакшен на винде всё равно извращение.
    Ответ написан
    7 комментариев