Odczytanie zagnieżdżonych danych z żądania HTTP

Odczytanie zagnieżdżonych danych z żądania HTTP
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No to gdzieś coś jest źle, bo metoda pop w tym miejscu odnosi się do słownika i validated_data powinno być słownikiem. Gdzieś coś musi być źle przypisane albo zadeklarowane.


Programować muszę, bo się uduszę
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
2
szafran98 napisał(a):

No to gdzieś coś jest źle, bo metoda pop w tym miejscu odnosi się do słownika i validated_data powinno być słownikiem. Gdzieś coś musi być źle przypisane albo zadeklarowane.

Gość nadpisał create() w widoku, a create() dostaje request, nie dict. To że próbuje go użyć jak słownika to inna sprawa.

edytowany 1x, ostatnio: Riddle
1programmer
Racja. Napisał, że robi jak docsach, więc założyłem, że ciężko coś tu zepsuć xd
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

Tak jak @Riddle napisał, metoda create ma być nadpisana w serializerze. Sam dałeś link do dokumentacji, a źle z niej przepisałeś XD

Kopiuj
class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ['username', 'email', 'profile']

    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        user = User.objects.create(**validated_data)
        Profile.objects.create(user=user, **profile_data)
        return user

Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

Nadpisalem Create w serializerze i teraz wysyłam w POSTMANIE następujący json na widok:

Kopiuj
{
    "invoice_num": "faktura 12-2022",
    "issuer": "IT Company, address, NIP 424234242",
    "header": "COmpany name, address, NIP 332423324",
    "notes": "Split payment",
    "lines": [
        {
            "name": "uslugi programistyczne",
            "net": 1000,
            "tax": 22
        },
        {
            "name": "hosting",
            "net": 200,
            "tax": 22
        }
    ]
}

i otrzymuje błąd:

Kopiuj
TypeError at /endpoint/
django.db.models.manager.BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method() argument after ** must be a mapping, not list

print(validated_data) zwraca teraz:

Kopiuj
{'invoice_num': 'faktura 12-2022', 'issuer': 'IT Company, address, NIP 424234242', 'header': 'COmpany name, address, NIP 332423324', 'notes': 'Split payment', 'lines': [OrderedDict([('name', 'uslugi programistyczne'), ('net', 1000), ('tax', 22)]), OrderedDict([('name', 'hosting'), ('net', 200), ('tax', 22)])]}

edytowany 1x, ostatnio: hubertsuder
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No to musisz debugować. Coś w metodzie create. Możliwe, że przekazujesz listę lines, a nie zmapowane instancje modelu. W docsach masz:

Kopiuj
def create(self, validated_data):
        tracks_data = validated_data.pop('tracks')
        album = Album.objects.create(**validated_data)
        for track_data in tracks_data:
            Track.objects.create(album=album, **track_data)
        return album

Zagnieżdżona relacja many-to-one jest tworzona w pętli. W metodzie create, którą wkleiłeś nie ma pętli.


Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

Teraz działa jak zrobiłem na podstawie tego kodu co mi wysłałeś. Szafran i RIddle macie u mnie browara.

ale nadal nie wiem jak wyprintowac na dokumencie PDF zagnieżdżony słownik lines. Próbuje:

Kopiuj
            lines = [[x['name'] for x in y['lines']] for y in request.data]
            for line in lines:
                 textob.textLine(line)

dostaje error:

string indices must be integers

print(request.data['lines']) zwraca:

[{'name': 'uslugi programistyczne', 'net': 3000, 'tax': 22}, {'name': 'hosting', 'net': 400, 'tax': 22}]

edytowany 3x, ostatnio: hubertsuder
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No brawo, zaraz podeślę adres na pw. XD

Dodatkowo jeśli to nie jest zdanie na studia, tylko faktycznie się tego uczysz, to weź podszkol się z czystego Django i Pythona. Django narzuca architekturę i udostępnia programiście API, ale dużo rzeczy dzieje się tam pod spodem i trzeba mieć wyobrażenie co tam się po kolei robi, bo inaczej ciężko o modyfikacje.


Programować muszę, bo się uduszę
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

Naprawiłeś? XD


Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

tego słownika nie moge wyprintować.

print(request.data['lines']) zwraca: [{'name': 'uslugi programistyczne', 'net': 3000, 'tax': 22}, {'name': 'hosting', 'net': 400, 'tax': 22}]

1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No i tak miało być przecież. To zamień lines = [x['name'] for x in main_dict['lines']]


Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

super. Tylko teraz mi printuje

Kopiuj
lines:
uslugi programistyczne
hosting

a to ma być faktura czyli nie tylko nazwa uslugi ale tez koszt i podatek czyli:

Lines:

  • usługi programistyczne - kwota - podatek

  • hosting - kwota - podatek

    teraz mam kod taki:

    Kopiuj
    lines = [x['name'] for x in request.data['lines']]
    for line in lines:
      textob.textLine('-------------------------------------------------------------------------------------'
                                  '-------------')
      textob.textLine(line)
    

    efekt taki:

Kopiuj
invoice num: faktura 12/2022
issuer: IT Company, address, NIP 424234242
header: COmpany name, address, NIP 332423324
notes: Split payment
--------------------------------------------------------------------------------------------------
uslugi programistyczne
--------------------------------------------------------------------------------------------------
hosting
edytowany 5x, ostatnio: hubertsuder
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No to już są proste operacje na słowniku.

Tutaj jak posługiwać się tą strukturą danych: https://realpython.com/python-dicts/
A tutaj o f-stringach poczytaj: https://realpython.com/python-f-strings/


Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

Nie ma rozwiązania w tym co mi wysłałeś. Muszę poszukać w internecie

1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
2

I nie będzie rozwiązania w internecie. Przecież nie znajdziesz przykładu, gdzie ktoś robi to samo z takimi samymi danymi. To Ty masz je wymyślić, a do tego musisz zrozumieć to co wysłałem w ostatnim poście. Żeby wypisywało to co chcesz, to jest jedna, maks dwie linijki kodu. Iteracje po lines już masz, więć musisz tylko wyciągnąć dane ze słownika.


Programować muszę, bo się uduszę
edytowany 1x, ostatnio: 1programmer
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

Wiem, że nie znajdę takiego samego przykładu ale mogę analogicznie zrobić do jakiegoś przykładu.

Proszę pomóż mi z tym bo męczę się i nie mogę sobie poradzić.

1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

Wariacie musisz tylko zmienić list comprehension, które Ci podałem XD

lines = [x['name'] for x in request.data['lines']]

Wiesz co znaczy operacja po prawej stronie działania? Zwróć wartość dla klucza name od x dla każdego x z listy, która znajduje się w słowniku request.data pod kluczem lines.

Teraz popatrz na to:

Kopiuj
name = 'programowanie'
net = 15000
tax = 19

invoice_service = f'{name} - {net} - {tax}'
print(invoice_service) -> programowanie - 15000 - 19

Prawda, że proste?

W tym: lines = [x['name'] for x in request.data['lines']], to co zwracasz dla każdego elementu, w tym przypadku x['name'] może być czymkolwiek. Stringiem, intem, boolem, funkcją, słownikiem, listą, krotką, klasą, obiektem i bóg wie czym jeszcze. W tym poście jest wszystko czego potrzebujesz. To jest ten przykład, który chciałeś szukać na necie.


Programować muszę, bo się uduszę
edytowany 1x, ostatnio: 1programmer
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
Kopiuj
name = 'programowanie'
net = 15000
tax = 19

invoice_service = f'{name} - {net} - {tax}'
print(invoice_service) -> programowanie - 15000 - 19

no to jest proste. to też rozumiem

Kopiuj
lines = [x['name'] for x in request.data['lines']]

ale nadal nie rozumiem jak stworzyć tą pętle, która będzie printowała kolejno name, net, tax. No bo przecież nie tak:

Kopiuj
lines = [x['name'], y['net'], c['tax'] for x, y ,c in request.data['lines']]

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
hubertsuder napisał(a):

ale nadal nie rozumiem jak stworzyć tą pętle, która będzie printowała kolejno name, net, tax. No bo przecież nie tak:

Kopiuj
lines = [x['name'], y['net'], c['tax'] for x, y ,c in request.data['lines']]

To Ci zwróci tuple z trzema wartościami. Możesz zrobić na całości print(lines) i zobaczyć co tam siedzi.

Jeśli chcesz najpierw wszystkie 'name', potem wszystkie 'net', etc. to możesz zrobić tak:

Kopiuj
print([x['name'] for x in request.data['lines']])
print([x['net'] for x in request.data['lines']])
print([x['tax'] for x in request.data['lines']])
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

Przecież możesz zwrócić stringa [f"{x['name']} - {x['net']} - {x['tax']}" for x in request.data['lines']]


Programować muszę, bo się uduszę
edytowany 1x, ostatnio: 1programmer
Riddle
Bad idea. Plus zapomniałeś klamerek.
1programmer
@Riddle: Można do funkcji to wyciągnąć, czy co innego masz na myśli, ale już nie chce mi się rozwodzić. To pewnie zadanie na studia, dawałem linki, przykłady, a jak ziomek od 3 dni tego nie rozkminił, to mi się nie chce zagłębiać w najlepsze/najładniejsze rozwiązanie.
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
Kopiuj
  lines = [f"x['name'] - x['net'] - x['tax']" for x in request.data['lines']]
  for line in lines:
      textob.textLine('-------------------------------------------------------------------------------------'
                      '-------------')
      textob.textLine(line)

zwraca:

Kopiuj
--------------------------------------------------------------------------------------------------
x['name'] - x['net'] - x['tax']
--------------------------------------------------------------------------------------------------
x['name'] - x['net'] - x['tax']

1programmer
x['name'] owrapuj w {}, zapomniałem
1programmer
Zresztą czytałeś o f stringach pod linkiem, który Ci dałem? Jakbyś czytał, to sam byś mnie poprawił, że klamer nie dałem i tam nie podstawi wartości.
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

No teraz śmiga dobrze. Działa wszystko. Tylko nadal nie wyglada to dobrze na fakturze. Macie jakis pomysl zeby to wizualnie poprawic?

I jeszcze chcialem, żeby zliczało wszystkie x['net'] w sume kwoty do zapłacenia.

Kopiuj
--------------------------------------------------------------------------------------------------
uslugi programistyczne - 1000 - 22
--------------------------------------------------------------------------------------------------
hosting - 200 - 22

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Czyli tobie od początku chodziło żeby zbudować taką tabelkę Ascii?

1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

Jak ma być ładniej? To zwykłe formatowanie stringów. Sumowanie net w pętli najprościej i będziesz miał spokój. Tak samo analogicznie. Masz przykłady w temacie albo na necie znajdziesz, zresztą pętle, to są chyba na 30 stronie książki z podstawami. Chyba wyniosłeś jakąś wiedzę przez te pięć stron tematu.


Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

dobra, jest dobrze. Dziekuje CI Szafran. Chciałbym CI sie jakoś odwdzieczyc

1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
2

Nie trzeba. Po prostu to są takie podstawowe rzeczy, że z mojej perspektywy masz totalny brak talentu do tego albo w dupie naukę. Nie chcę Cię posądzać, że nie masz umiejętności, żeby to ogarnąć, więc bardziej zakładam, że nie chcesz tego zrozumieć. Triggeruje mnie takie podejście, bo zawsze na koniec semestru pojawiają się tutaj studenciaki, którzy udają, że mają problem z czymś, a koniec końców chcą gotowca albo po prostu wklejają treść zadania i proszą o rozwiazanie. Parę dni temu był tu taki, to jeszcze bezczelnie pytał, czemu go pouczam, a nie po prostu dam gotowca XD
Nie chcę generalizować, są też tacy, którzy faktycznie próbują, ale czegoś nie wiedzą i takim z chęcią pomogę.

Jak chcesz mieć szybko rozwiązanie i programowanie Cię w ogóle nie interesuje, to wtedy tworzysz temat w dziale "Ogłoszenia drobne" i zaoszczędzisz czas, swój i kogoś. Jeśli faktycznie próbujesz coś sam zrobić i nie możesz znaleźć rozwiązanie, to na pewno ktoś Ci pomoże.


Programować muszę, bo się uduszę
ledi12
Dawaj Jacula, weź go do świata o którym nie ma pojęcia :D
1programmer
@ledi12: Nie no Dareczku takim to odpuszczam, ale z takimi poziomkami jak kilka dni temu to jest jazda do spodu haah
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

Szafran podałeś mi dobre rozwiazanie:

Kopiuj
lines = [f"{x['name']} - net pay: {x['net']} zl - tax: {x['tax']} %" for x in request.data['lines']]
for line in lines:
    textob.textLine('-------------------------------------------------------------------------------------'
                    '-------------')
    textob.textLine(line)

Tylko że w pętli line in lines nie moge się odwoływać do zmiennych wtedy. I nie moge zsumować kwoty brutto, czyli wymnożyć 2 zmienne, x['net'] x x['tax']. Udało mi się tylko z kwotą netto:

Kopiuj
lines_net = [x['net'] for x in request.data['lines']]
net_pay = 0
for line in lines_net:
    net_pay += line

edytowany 1x, ostatnio: hubertsuder
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

Jak dla każdej lini chcesz zwrócić kwotę netto i brutto, to zrób tak:

Kopiuj
def remap_lines_dict(line):
  line.update(
    {'gross_ammount': line['net'] * float(f"1.{line['tax']}")})

  return line


lines = [remap_lines_dict(line) for line in dict['lines']]

Nie jest 1:1 jak Ty napisałeś, bo nie mam czasu teraz rozkminiać. Masz listę i na stringi już sobie zmapujesz.


Programować muszę, bo się uduszę
edytowany 4x, ostatnio: 1programmer
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

nic mi nie printuje jak robie tak jak mówisz. Po prostu puste na pdf

1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

A co jest w lines?


Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0

[None, None]

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)