Эквивалент Laravel dd () в django

Я новичок в Django, и мне трудно понять, как распечатать то, что у объекта есть внутри. Я имею в виду тип и значение переменной с ее членами внутри. Так же, как функция dd(object) в Laravel. dd() от Laravel - удобный инструмент для отладки приложения.

Я искал это. Но ничего полезного не нашел. Я пробовал pprint(), simplejson, print(type(object) и {% debug %}. Но ни один из них не мог предоставить требуемую информацию об объекте. Вот пример вывода функции dd() Laravel. Эквивалент Laravel dd () в django

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

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

Я использую Django версии 2.0.5. и пытаюсь распечатать django.contrib.messages

Кроме того, я хочу, чтобы вывод отображался в браузере, а не в консоли. Хорошо читаемым образом, поэтому я прошу пакет Django, который может принимать объект и отображать правильно сформированное представление объектной архитектуры.

Возможный дубликат Список атрибутов объекта

Sardorbek Imomaliev 27.05.2018 18:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
18
2
3 911
4

Ответы 4

Вы ищете недвижимость __dict__ или dir()

print(object.__dict__)

Используйте pprint для улучшения вывода

from pprint import pprint
pprint(dir(object))

как я могу увидеть это в браузере, например в laravel?

Rolly 30.11.2018 15:34

@roll you нет простого способа сделать это, используйте вывод консоли

Sardorbek Imomaliev 01.12.2018 08:13

также можно использовать vars, если вы хотите увидеть значения: from pprint import pprint pprint (vars (prospect))

surgiie 22.04.2019 22:00

Поднимите исключение. Предполагая, что у вас есть отладка, вы увидите сообщение об исключении. Это грубо, но в прошлом мне помогало.

Просто:

 raise Exception("I want to know the value of this: " + myvariable_as_a_string)

Другие ответы и комментаторы проигнорировали важную часть функции dd (), которая предотвращает такие вещи, как последующие перенаправления.

На самом деле Django не предоставляет этой специализированной функции. Поэтому, чтобы избавиться от этой проблемы, я создал специальную функцию типа dd() и использую ее во всех проектах Django. Возможно, это кому-то поможет.

Предположим, у нас есть папка библиотеки с именем app_libs, и в этой папке у нас есть файл библиотеки с именем dump.py. Нравится app_libs > dump.py:

from django.core import serializers
from collections.abc import Iterable
from django.db.models.query import QuerySet
from django.core.exceptions import ObjectDoesNotExist


def dd(request, data=''):
    try:
        scheme      = request.scheme
        server_name = request.META['SERVER_NAME']
        server_port = request.META['SERVER_PORT']
        remote_addr = request.META['REMOTE_ADDR']
        user_agent  = request.META['HTTP_USER_AGENT']
        path        = request.path
        method      = request.method
        session     = request.session
        cookies     = request.COOKIES

        get_data = {}
        for key, value in request.GET.lists():
            get_data[key] = value

        post_data = {}
        for key, value in request.POST.lists():
            post_data[key] = value

        files = {}
        for key, value in request.FILES.lists():
            files['name'] = request.FILES[key].name
            files['content_type'] = request.FILES[key].content_type
            files['size'] = request.FILES[key].size

        dump_data = ''
        query_data = ''
        executed_query = ''
        if data:
            if isinstance(data, Iterable):
                if isinstance(data, QuerySet):
                    executed_query = data.query
                    query_data = serializers.serialize('json', data)
                else:
                    dump_data = dict(data)
            else:
                query_data = serializers.serialize('json', [data])


        msg = f'''
            <html>
                <span style = "color: red;"><b>Scheme</b></span>        : <span style = "color: blue;">{scheme}</span><br>
                <span style = "color: red;"><b>Server Name</b></span>   : <span style = "color: blue;">{server_name}</span><br>
                <span style = "color: red;"><b>Server Port</b></span>   : <span style = "color: blue;">{server_port}</span><br>
                <span style = "color: red;"><b>Remote Address</b></span>: <span style = "color: blue;">{remote_addr}</span><br>
                <span style = "color: red;"><b>User Agent</b></span>    : <span style = "color: blue;">{user_agent}</span><br>
                <span style = "color: red;"><b>Path</b></span>          : <span style = "color: blue;">{path}</span><br>
                <span style = "color: red;"><b>Method</b></span>        : <span style = "color: blue;">{method}</span><br>
                <span style = "color: red;"><b>Session</b></span>       : <span style = "color: blue;">{session}</span><br>
                <span style = "color: red;"><b>Cookies</b></span>       : <span style = "color: blue;">{cookies}</span><br>
                <span style = "color: red;"><b>Get Data</b></span>      : <span style = "color: blue;">{get_data}</span><br>
                <span style = "color: red;"><b>Post Data</b></span>     : <span style = "color: blue;">{post_data}</span><br>
                <span style = "color: red;"><b>Files</b></span>         : <span style = "color: blue;">{files}</span><br>
                <span style = "color: red;"><b>Executed Query</b></span>: <span style = "color: blue;"><br>{executed_query}</span><br>
                <span style = "color: red;"><b>Query Data</b></span>    : <span style = "color: blue;"><br>{query_data}</span><br>
                <span style = "color: red;"><b>Dump Data</b></span>     : <span style = "color: blue;"><br>{dump_data}</span><br>
            </html>
        '''

        return msg
    except ObjectDoesNotExist:
        return False

когда вам нужно использовать эту функцию, просто вызовите ее так в любом views.py:

from django.http import HttpResponse
from django.shortcuts import render
from django.views import View

from app_libs.dump import dd
from .models import Products

class ProductView(View):
    def get(self, request):
        data = {}
        data['page_title'] = 'products'
        data['products'] = Products.objects.get_all_product()

        template = 'products/collections.html'

        dump_data = dd(request, data['products'])
        return HttpResponse(dump_data)

        # return render(request, template, data)

это оно.

You can set breakpoint just after variable you need to inspect.

# for example your code looks like
...other code
products = Product.objects.all()
# here you set a breakpoint
breakpoint()
...other code
Now you need to call you code in this exact location and due to breakpoint it stops.
Then you want to look up in terminal, it switched to special mode where you need to 
enter code like this one:
products.__dict__ # and hit enter. Now you'll see all properties in your variable.

Другие вопросы по теме