Ответы пользователя по тегу Django
  • Корректно ли указывать так адреса в корневом urls.py?

    WStanley
    @WStanley
    Back-end Developer
    Да, ты правильно понимаешь. Думаю что это не особо корректно, но я так писал и это работает на одном из сайтов уже больше года, проблем нет.
    только я коммент оставил, на всякий
    # Эти 2 роута всегда внизу! posts последний!
        path('', include('front.urls')),
        path('', include('posts.urls')),

    Это у меня связано с тем, что СЕОшник просит все ссылки сделать короткими на сайте, т.е. они все вида
    domain.ru/my_link
    Ответ написан
    Комментировать
  • Как сформировать вывод элементов по алфавиту с группировкой?

    WStanley
    @WStanley
    Back-end Developer
    Например raw запросом можно это получить
    https://docs.djangoproject.com/en/3.1/topics/db/sq...
    books = Books.objects.raw(
        """SELECT id, name FROM            
        (
            SELECT DISTINCT NULL AS id, LEFT(name, 1) AS name FROM Books
            UNION ALL
            SELECT DISTINCT  id, name FROM  Books AS Books1
            ORDER BY name
        ) AS t1
        ORDER BY name""")
    
    for book in books:
        print(book.id)
        print(book.name)
    Ответ написан
    Комментировать
  • Как в Django на главной странице вывести одну запись из БД?

    WStanley
    @WStanley
    Back-end Developer
    Трям!
    DetailView - выводит на страницу 1 запись, да. Но для вывода она просит передать ей pk этой записи (primary key который id обычно) или slug(его у тебя нет в таблице), о чем и говорит твоя ошибка - MainPagesDetailView must be called with either an object pk or a slug in the URLcon

    urlpatterns = [
        path('<int:id>/', views.MainPagesDetailView.as_view(), name='index'),
        # или
        path('<slug:slug>/', views.MainPagesDetailView.as_view(), name='index'),
    ]

    Соответственно обратиться на страницу придется по ключу
    http://my_domain/pk/ 
    или
    http://my_domain/slug/

    Почитай доку
    https://docs.djangoproject.com/en/3.1/ref/class-ba...
    ПС: id в таблице у тебя есть

    Если же ты хочешь вывести на главной странице запись по обращению к домену без ключа, то используй например TemplateView
    https://docs.djangoproject.com/en/3.1/ref/class-ba...
    в get_context_data передай в шаблон любые данные кот нужны и обращайся к ним в шаблоне
    Ответ написан
  • Почему шаблон django игнорирует id в словаре?

    WStanley
    @WStanley
    Back-end Developer
    1. Тебе надо чтобы твоя модель с комментариями имела ключ сама на себя
    parent = models.ForeignKey("self")
    2. Тебе надо во вью сформировать к примеру вот такой список с данными
    ПС: это делается с помощью рекурсивной функции, гугли (как рекурсивно сформировать дерево, примерно)
    ПС2: в список возможно также стоит включить parent_id и все что необходимо
    comments = [{
        'id': 1,
        'text': 'asdaasd',
        'childrens': []
    },
    {    'id': 2,
        'text': 'asdaasd',
        'childrens': [
            {    'id': 7,
                'text': 'asdaasd',
                'childrens': [
                    {    'id': 12,
                        'text': 'asdaasd',
                        'childrens': [
                            {    'id': 23,
                                'text': 'asdaasd',
                                'childrens': [],
                            },
                            ... # и т.д.
                        ],
                    },
                    ... # и т.д.
                ],
            },
            {    'id': 8,
                'text': 'asdaasd',
                'childrens': [],
            },
            ... # и т.д.
        ],
    },
    {    'id': 2,
        'text': 'asdaasd',
        'childrens': [
            {    'id': 15,
                'text': 'asdaasd',
                'childrens': [],
            },
            {    'id': 19,
                'text': 'asdaasd',
                'childrens': [],
            },
            ... # и т.д.
        ],
    }
    ... # и т.д.
    ]

    3. После этого выкинуть его в шаблон, и в шаблоне можно будет сделать так:
    ПС: там где список childrens пустой значит нет комментариев-ответов
    {%for comment in comments%}
        {{ comment.id }}
        {{ comment.text }}
        {% if comment.childrens %}
             # По идее здесь тоже надо будет организовать рекурсию, для отображения множественной вложенности
             # гугли - django template recursive tree, примерно
             # К вложенным комментариям вот так можно обращаться будет
            {% for children in comment.childrens  %}
                 {{ children.id }}
                 {{ children.text }}
                 {% if children.childrens %}
                      # и т.д.
                 {% endif %}
            {% endfor %}
        {% endif %}
    {% endfor %}

    Вот примерно так все это должно работать если использовать ссылку на себя
    ПС: а вообще для работы с деревом грамотно использовать nested sets что и делается в django-mptt, но это уже совсем другая история :)
    Удачного велосипедирования!
    Ответ написан
    4 комментария
  • Как получить переменную из строки запроса GET?

    WStanley
    @WStanley
    Back-end Developer
    Есть midlleware в django django.contrib.auth.middleware Он как раз ложит авторизованного юзера в request поэтому во всех views в request можно обратиться и получить авторизованного юзера вот так:
    def get_queryset(self)
        user = self.request.user # тут юзер
        user_id = self.request.user.id # так ИД юзера

    https://docs.djangoproject.com/en/3.1/ref/middlewa...
    И передавать ИД авторизованного юзера через url нет смысла

    Получить параметр с Урла можно так
    https://docs.djangoproject.com/en/3.1/topics/http/...
    path("<int:my_param>/profile/", ProfileUpdate.as_view(), name="profile-api-update" ),
    # Только я бы последним параметр передавал, вот так
    # path("/profile/<int:my_param>/", ProfileUpdate.as_view(), name="profile-api-update" ),
    
    class ProfileUpdate(View):
    
        def get(self, request, my_param):
            print(my_param)
            return render(request, self.template_name)
    
        def post(self, request, my_param):
            print(my_param)
            return render(request, self.template_name)
    
        def get_queryset(self):
            my_param=self.kwargs['my_param']
            my_param=self.kwargs.get('my_param') # лучше так
    Ответ написан
  • Как изменять значение integer через views?

    WStanley
    @WStanley
    Back-end Developer
    Что именно наддо то?
    from app_name.models import Profile
    
    profiles = Profile.objects.all()
    # получить
    for profile in profiles:
        print(profile.monetki)
    
    # присвоить
    profiles = Profile.objects.filter(monetki=0)
    for profile in profiles:
        profile.monetki = 25
        profile.save()
    Ответ написан
    Комментировать
  • Как связать модели в Django учитывая условия?

    WStanley
    @WStanley
    Back-end Developer
    Привет!
    Примерно так это должно работать
    ссылка на источник
    в admin.py
    @admin.register(Ordering)
    class OrderingAdmin(admin.ModelAdmin):
    
    	def formfield_for_foreignkey(self, db_field, request, **kwargs):
    	        if db_field.name == "system":
    	            kwargs["queryset"] = Code.objects.filter(used=True)
    	        return super().formfield_for_foreignkey(db_field, request, **kwargs)
    Ответ написан
    Комментировать
  • Почему выдает TemplateDoesNotExist at /?

    WStanley
    @WStanley
    Back-end Developer
    Путь добавить надо
    https://docs.djangoproject.com/en/3.0/ref/settings...
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                os.path.join(BASE_DIR, 'templates'),
            ],
    Ответ написан
    2 комментария
  • TemplateSyntaxError at. Как решить?

    WStanley
    @WStanley
    Back-end Developer
    Чтобы сделать тег доступным для всех шаблонов его надо прописать в settings
    TEMPLATES = [
        {
            'OPTIONS': {
                'builtins': [
                    'myprojectname.templatetags.somemodule',  # Пример
                    ...
                    'myprojectname.templatetags.blog_tags'  # Примерно так
                    ],
    Ответ написан
    6 комментариев
  • Почему не работает js в django?

    WStanley
    @WStanley
    Back-end Developer
    Uncaught TypeError: Cannot read property 'getContext' of null

    Insanus, в canvasBody вы получаете null, а у null нет свойства getContext
    const canvasBody = document.getElementById("canvas"),
    drawArea = canvasBody.getContext("2d");

    Вероятнее всего это потому, что элемента "canvas" в DOM еще не существует, а вы к нему обращаетесь, надо дождаться пока DOM сформируется ссылка1, ссылка2, ссылка3
    Либо подключите jquery и оберните код в: ссылка
    $( document ).ready(function() {
        console.log( "ready DOM" );
       // ваш код
    });

    Первое, что стоит попробовать это перенести подключение js кода ниже, но это врятли поможет, надо дождаться формирования DOM
    <canvas id="canvas"></canvas>
    
    <script src="{% static 'js/main.js' %}"></script>
    </body>
    </html>
    Ответ написан
    Комментировать
  • Как проверить уникальность поля Django и показать на форме?

    WStanley
    @WStanley
    Back-end Developer
    В модели надо сделать поле уникальным unique=True
    Тогда форма будет возвращать ошибку "такая запись уже есть"
    ссылка на доку
    Ответ написан
    Комментировать
  • Django система комментариев?

    WStanley
    @WStanley
    Back-end Developer
    Трям!
    В form.post надо передавать пост на который оставили коммент, а ты все посты передаешь и id поста надо передавать с формы
    from django.core.exceptions import ObjectDoesNotExist
    
    def home(request):
       if request.method == 'POST':
          id = request.POST.get('id', None)
          if id:
             try:
                post = Post.objects.get(pk=id)
             except ObjectDoesNotExist:
                return () # обработка ошибки пост не найден
             if form.is_valid():
                form = form.save(commit=False)
                form.user = request.user
                form.post = post 
                form.save()
                return () # все хорошо, коммент сохранен
             return () # обработка ошибки форма не валидная
          return () # обработка ошибки id не передан
       # else здесь не обязательно писать код выполнится только если не ПОСТ
       context = {
          'form': CommentForm(),
          'comments': Comment.objects.filter(moderation=True)
       }
       return (request, 'blog/index.html', context) # return метод GET

    По сути надо также посмотреть на CommentForm и Trace ошибки
    Я нашел лишь одну ошибку, надеюсь поможет

    И все комменты наверное через all надо получать
    comments = Comment.objects.all()
    Либо так
    comments = Comment.objects.filter(moderation=True)

    Так же юзера лучше получать вот так:
    from django.contrib.auth import get_user_model
    User = get_user_model()

    И прописывать имя приложения перед точкой pep8
    from name_app.models import Post, Comment # после запятой пробел
    Ответ написан
    1 комментарий
  • Как вернуть url из модели в шаблон?

    WStanley
    @WStanley
    Back-end Developer
    Ты передаешь slug в product_list, но делаешь это без уважения и не принимаешь его
    ссылка на доку
    ссылка на доку 2 (пример)
    path('  тут принять slug  ', views.ProductView.as_view(), name='product_list'),]
    Ответ написан
  • Платежи на Django. Как реализовать?

    WStanley
    @WStanley
    Back-end Developer
    Доброго!
    Ну если в общах чертах то происходит это так:
    На сайте надо создать корзину, чтоб пользователь мог собрать воедино то что он хочет купить.
    При переходе в корзину у него должна быть кнопка "оформить заказ" при этом можно дать выбрать ему способ доставки, ввести свой адрес и остальные требуемые вещи.
    Далее варианта 2:
    Первый простой:
    • Регистрируетесь в интернет кошельке например(яндекс, вебмани и тд) получаете свой уникальный номер кошелька
    • в этом кошельке есть пример куда и как отправлять данные об оплате
    • вы просто реализуете выполнение этих инстукций по нажатию кнопки "оформить заказ"
    • после оплаты сайт-кошелек перенаправит пользователя обратно(обратная ссылка указывается в настройках) вам на сайт где вы его уведомите об удачной оплате и пожелаете хорошего дня!

    Второй сложный:
    • Ваш заказчик заключает договор с банком "рога и копыта"
    • В банке также будет инструкция по правилам которой вы будете отправлять данные об оплате заказа
    • скорее всего еще будут спец ключи(сертификаты) для идентификации клиета(в инструкции будет описано)
    • Так же заказчику придется прикупить кассовый аппарат
    • после оплаты банк перенаправит пользователя обратно(обратная ссылка указывается в настройках) вам на сайт где вы его уведомите об удачной оплате и пожелаете хорошего дня!


    Подробнее не получится ибо у всех систем свои нюансы, но они описаны в инструкциях, чаще всего в разделе "для разработчикоф"
    Данные придется отправлять методом POST, на сайте надо будет организовать https, но это не точно!
    Ответ написан
    Комментировать
  • Разница между сайтом "блог" и "новостным" сайтом?

    WStanley
    @WStanley
    Back-end Developer
    В чем отличие между сайтом "блог" и "новостным" сайтом, в техническом плане?

    В целом разницы нет.

    Какие модули, библиотеки используются для создания сайта новостей в Django?

    Именно те модули и библиотеки которые нужны для создания конкретного сайта новостей

    Какие модули, библиотеки используются для создания сайта блог в Django?

    Именно те модули и библиотеки которые нужны для создания конкретного сайта блога

    За googlи! - гуглил четкого ответа нет!

    Гугл четкого ответа не даст, т.к. технически это одно и тоже, зависит от конкретной задачи

    Зачем Django когда есть Wordpress - ответ: потому что Python!

    Согласен!
    Ответ написан