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

Odczytanie zagnieżdżonych danych z żądania HTTP
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
Kopiuj
{
    "id": 1,
    "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
        }
    ]
},

do invoice_num odwołujemy się poprzez request.data['invoice_num'].

a jak odwołać się do lines.name?

edytowany 6x, ostatnio: Riddle
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:8 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
5

Może request.data['invoice_num.lines[0].name'] ?
Co to za biblioteka to sprawdzę za ciebie w dokumentacji


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
KamilAdam napisał(a):

Może request.data['invoice_num.lines[0].name'] ?
Co to za biblioteka to sprawdzę za ciebie w dokumentacji

Kopiuj
MultiValueDictKeyError at /endpoint/

'invoice_num.lines[0].name'

Łącze api djangorestframework z pythonem

edytowany 2x, ostatnio: Riddle
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:8 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

Miało być request.data['lines[0].name']
CO to za biblioteka do parsowania? CO tam masz za importy?
Jakis standard z django?


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
3
Kopiuj
lines = list(map(lambda x: x['name'], request.data['lines']))

albo

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

Programować muszę, bo się uduszę
edytowany 6x, ostatnio: 1programmer
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
szafran98 napisał(a):
Kopiuj
lines = list(map(lambda x: x.name), request.data['invoice_num'].lines)
Kopiuj
TypeError at /endpoint/

map() must have at least two arguments.
edytowany 1x, ostatnio: Riddle
1programmer
teraz jest git, bo zapomniałem, że dict nie działa jak obiekt w jsie
Riddle
@hubertsuder: Nie umieszczaj kodu w cytatach. Użyj do tego składni ```py oraz ``` lub kontrolki </> albo skrótu Ctrl+Alt+C.
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
Kopiuj
lines = [x['name'] for x in request.data['lines']]
Kopiuj
MultiValueDictKeyError at /endpoint/

'lines'
Kopiuj
lines = list(map(lambda x: x['name'], request.data['lines']))
Kopiuj
MultiValueDictKeyError at /endpoint/

'lines'
edytowany 1x, ostatnio: Riddle
Riddle
@hubertsuder: Nie umieszczaj kodu w cytatach. Użyj do tego składni ```py oraz ``` lub kontrolki </> albo skrótu Ctrl+Alt+C.
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No to musisz się odwołać do prawidłowego słownika. Ja nie siedzę w twoim środowisku i tego nie wiem. Jeśli to Django, to sprawdź dokumentację, skąd wyciągnąć ten słownik, przecież skądś go do pierwszego posta wziąłeś. Weź może wyciągnij to metodą get. request.data.get('lines')

screenshot-20221216124556.png


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

Wziąłem go z API djangorestframework.

Zrzut ekranu z 2022-12-16 12-49-31.png

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

Pokaż kod, gdzie to robisz, co ci dałem.


Programować muszę, bo się uduszę
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
Kopiuj
buffer = io.BytesIO()

# Create the PDF object, using the buffer as its "file."
p = canvas.Canvas(buffer)

# Draw things on the PDF. Here's where the PDF generation happens.
# See the ReportLab documentation for the full list of functionality.
p.drawString(30, 800, 'invoice num: ' + request.data['invoice_num'])
p.drawString(30, 750, 'issuer: ' + request.data['issuer'])
p.drawString(30, 700, 'header: ' + request.data['header'])
p.drawString(30, 650, 'notes: ' + request.data['notes'])

lines = list(map(lambda x: x['name'], request.data['lines']))
p.drawString(30, 600, 'lines:' + lines)
edytowany 1x, ostatnio: Riddle
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
hubertsuder napisał(a):
Kopiuj
p.drawString(30, 600, 'lines:' + lines)

Jakiego wyniku oczekujesz od string+list?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: Riddle
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
4

Wychodzi, że w request.data masz dict, a nie listę. MultiValueDict posiada metodę get() do pobierania wartości klucza, więc tym sprawdź co wyżej podawałem.
https://github.com/django/django/blob/205c36b58fed5a1a0ff462593fc61b58189027d8/django/utils/datastructures.py#L49

Jeśli request.data to lista słowników, to:

Kopiuj
lines = list(map(lambda x: [x['name'] for x in x['lines']], request.data))

lub

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

Programować muszę, bo się uduszę
edytowany 3x, ostatnio: Riddle
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
szafran98 napisał(a):

Wychodzi, że w request.data masz dict, a nie listę. MultiValueDict posiada metodę get do pobierania wartości klucza, więc tym sprawdź co wyżej podawałem.
https://github.com/django/django/blob/205c36b58fed5a1a0ff462593fc61b58189027d8/django/utils/datastructures.py#L49

Jeśli request.data to lista słowników, to:

Kopiuj
lines = list(map(lambda x: [x['name'] for x in x['lines']], request.data))

lub

lines = [[x['name'] for x in y['lines']] for y in request.data]
Kopiuj
TypeError at /endpoint/

string indices must be integers

zarówno na 1 i na 2 ten sam bląd.

Kopiuj
buf = io.BytesIO()
c = canvas.Canvas(buf, pagesize=letter, bottomup=0)
textob = c.beginText()
textob.setTextOrigin(inch, inch)
textob.setFont('Helvetica', 14)
lines = [
    'invoice num: ' + request.data['invoice_num'],
    'issuer: ' + request.data['issuer'],
    'header: ' + request.data['header'],
    'notes: ' + request.data['notes'],
    'lines: '
]
for line in lines:
    textob.textLine(line)

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

c.drawText(textob)
c.showPage()
c.save()
buf.seek(0)
edytowany 1x, ostatnio: Riddle
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
2

@hubertsuder: No, ale wkleiłeś po prostu to co napisałem, czy faktycznie sprawdziłeś co się znajduje w request.data? Wklej co podaje:

Kopiuj
print(request.data)
print(type(request.data))

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

zwraca None

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

To czegoś nie rozumiem. Jakim cudem wcześniej wyciągasz request.data['issuer'], a dalej okazuje się, że request.data ma typ None?


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

coś pomieszałem. Bo print() wzialem wpisalem do responsu:

Kopiuj
return HttpResponse(print(type(request.data)))

widocznie tak nie mozna

edytowany 2x, ostatnio: Riddle
Riddle
@hubertsuder: Nie umieszczaj kodu w cytacie. Użyj do tego składni ```py oraz ```.
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No nie. To nie ma być w żadnym response. To się wyświetli w terminalu/konsoli, w której jest uruchomiona aplikacja i bardziej mnie interesuje, co zwraca print(request.data).


Programować muszę, bo się uduszę
edytowany 1x, ostatnio: 1programmer
hubertsuder
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • Postów:119
0
Kopiuj
<QueryDict: {'csrfmiddlewaretoken': ['spO8Lag44qMCGkA45VlnWXOdSRGpTImov8x3eERa89Lg7K5Zk7PMkkpw7KSvoIg7'], 'invoice_num': ['faktura 12-2022'], 'issuer': ['IT Company, address, NIP 424234242'], 'header': ['COmpany name, address, NIP 332423324'], 'notes': ['Split payment']}>

mam zakomentowane w serializers.py

Kopiuj
# lines = LineSerializer(many=True) 

bo testuje teraz bez tej funkcji bo mi blad zwraca

edytowany 5x, ostatnio: Riddle
Riddle
Używaj odpowiedniej składni Markdown. Znajdziesz informacje o niej poniżej edytora, po prawej stronie pod Instrukcja obsługi Markdown.
ledi12
  • Rejestracja:ponad 5 lat
  • Ostatnio:20 dni
  • Lokalizacja:Wrocław
50
hubertsuder napisał(a):
Kopiuj
<QueryDict: {'csrfmiddlewaretoken': ['spO8Lag44qMCGkA45VlnWXOdSRGpTImov8x3eERa89Lg7K5Zk7PMkkpw7KSvoIg7'], 'invoice_num': ['faktura 12-2022'], 'issuer': ['IT Company, address, NIP 424234242'], 'header': ['COmpany name, address, NIP 332423324'], 'notes': ['Split payment']}>


mam zakomentowane w serializers.py

Kopiuj
# lines = LineSerializer(many=True) 

bo testuje teraz bez tej funkcji bo mi blad zwraca

No mając zakomentowany serializer (który podałem Ci w poprzednim temacie) żadne z powyższych rozwiązań Ci nie zadziała. Wytłumacz co dokładnie chcesz zrobić, bo nadal nie rozumiem po przeczytaniu tego wątku. @szafran98 podał Ci sensowne rozwiązanie na podstawie opisu (dostęp do konkretnego klucza w liście obiektów) a Ty nadal cudujesz. Coś tutaj nie gra.


Robię http response status cody w martwych ciągach
edytowany 1x, ostatnio: Riddle
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:37 minut
  • Lokalizacja:Laska, z Polski
  • Postów:10056
1
hubertsuder napisał(a):

Łącze api djangorestframework z pythonem

:D

edytowany 1x, ostatnio: Riddle
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
2
hubertsuder napisał(a):
Kopiuj
<QueryDict: {'csrfmiddlewaretoken': ['spO8Lag44qMCGkA45VlnWXOdSRGpTImov8x3eERa89Lg7K5Zk7PMkkpw7KSvoIg7'], 'invoice_num': ['faktura 12-2022'], 'issuer': ['IT Company, address, NIP 424234242'], 'header': ['COmpany name, address, NIP 332423324'], 'notes': ['Split payment']}>

mam zakomentowane w serializers.py

Kopiuj
# lines = LineSerializer(many=True) 

bo testuje teraz bez tej funkcji bo mi blad zwraca

No to ziomek, proszę Cię, sam nie pomagasz rozwiązać problemu. Przecież to jest banalny case. Masz dict przypisany do zmiennej i chcesz coś z niego wyciągnąć. Przecież my nie wiemy, co tam jest, nie wklejaj kodu, który dostajesz, na ślepo, tylko ze zrozumieniem. Zastanawiałeś się, jak działa ten kod, który Ci podałem? Wiesz jak działa map, co to lambda, list comprehension? Jeśli nie to nie wchodź w Django, bo problemów będzie tylko więcej. Jeszcze raz powtórzę, pokaż co jest w request.data.


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

Jak

Kopiuj
lines = LineSerializer(many=True)

nie jest zakomentowany to nie moge wysłać json na widok bo mi zwraca błąd, że te pola są wymagane. Dlatego nie moge sprawdzić co jest w request.data.

A jak zakomentuje to moge wyslac slownik wtedy bez zagniezdzenia LINES i wtedy request.data zwraca:

Kopiuj
<QueryDict: {'csrfmiddlewaretoken': ['VcJzVZzMhBUS2TkK4BzEaQdRJjObEm81YVsuotaSlkTwtjPFjN33ydOaYc0h9m2K'], 'invoice_num': ['faktura 12-2022'], 'issuer': ['IT Company, address, NIP 424234242'], 'header': ['COmpany name, address, NIP 332423324'], 'notes': ['Split payment']}>
edytowany 7x, ostatnio: Riddle
Riddle
@hubertsuder: Pisałem Ci to już 5 razy, i napiszę jeszcze raz. Nie wrzucaj kodu do cytatów tylko do specjalnych znaczników formatowania kodu ```py oraz ```.
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

To wysyłaj requesta przez postmana albo curla. Ja pamietam, że panel DRF średnio ogarnia relacje itd. Zresztą jest szybciej, łatwiej i przyjemniej.


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

Jak mam odkomentowany lines = LineSerializer(many=True) i wysyłam POST na widok to wyskakuje mi błąd:

Kopiuj
AssertionError at /endpoint/
The `.create()` method does not support writable nested fields by default.
Write an explicit `.create()` method for serializer `api.serializers.EndpointSerializer`, or set `read_only=True` on nested serializer fields.

Nie obsługuje zagnieżdżonych słowników... trzeba nadpisać funkcje create w views. Próbuje nadpisać widok zgodnie z

https://www.django-rest-framework.org/community/3.0-announcement/#writable-nested-serialization

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

No i o to chodzi. Django musi wiedzieć jak serializować zagnieżdżony model.


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

Robie analogiczne do tutoriala z django rest framework i po nadpisaniu widoku:

Kopiuj
def create(self, validated_data):
    lines_data = validated_data.pop('lines')
    endpoint = Endpoint.objects.create(**validated_data)
    Line.objects.create(endpoint=endpoint, **lines_data)
    return Endpoint

Modele:

Kopiuj
class Endpoint(models.Model):
    invoice_num = models.CharField(max_length=100)
    issuer = models.CharField(max_length=100)
    header = models.CharField(max_length=100)
    notes = models.CharField(max_length=100)

    def __str__(self):
        return self.invoice_num

class Line(models.Model):
    endpoint = models.ForeignKey(Endpoint, on_delete=models.CASCADE, blank=True, null=True, related_name='lines')
    name = models.CharField(max_length=100)
    net = models.IntegerField()
    tax = models.IntegerField()

    def __str__(self):
        return str(self.lines) +' - '+self.name

class PdfModel(models.Model):
    def pdf_upload_path(instance, filename):
        # return f'{instance.created_date.strftime("%Y-%m-%d")}{filename}'
        return f'{filename}'

zwraca mi błąd:

Kopiuj
AttributeError at /endpoint/

'Request' object has no attribute 'pop'
edytowany 5x, ostatnio: Riddle
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:498
1

No to sprawdź, co jest w validated_data w metodzie create.


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

<rest_framework.request.Request: POST '/endpoint/'> to mi zwraca po print(validated_data)

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)