Blad w Django. Prosba o pomoc

Blad w Django. Prosba o pomoc
IG
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:27
0

Czesc,
link do projektu: https://github.com/ichecinski/chess_guide

Pojawia mi sie taki blad. Wie ktos moze jak sobie z nim poradzic?

chess.Ruch.figura: (fields.E300) Field defines a relation with model 'Figura', which is either not installed, or is abstract.
chess.Ruch.figura: (fields.E307) The field chess.Ruch.figura was declared with a lazy reference to 'chess.figura', but app 'chess' doesn't provide model 'figura'.

Czy w pliku admin.py dodac 'figura'?

IG
Pojawia mi się ten błąd w momencie jak chce uruchomić serwer. Dodatkowo Figura jest klasa atrakcyjną i zastanawiam się czy rejestrować ja w profilu admina
Z2
  • Rejestracja:prawie 2 lata
  • Ostatnio:prawie 2 lata
  • Postów:22
2

abstract = True - powoduje, że django nie stworzy tabelki pod ten model, ta tabelka musi wcześniej istnieć jeśli pozostałe tabelki odwołują się do niej poprzez klucz obcy.

EDIT:

Ogólnie utrudniasz sobie pracę.

Widać, że łatwiej Ci jest gdy masz stan gry określony poza bazą, a mimo to próbujesz określić logikę na djangowych modelach.

Opieranie logiki bezpośrednio na djangowych modelach jest OK, gdy robisz coś trywialnego, i gdzie świadomie olewasz dobre zasady dotyczące obiektowości, aby poprzez django skrót ułatwić sobie interakcje bazy z pozostałymi rzeczami jakie django oferuje.

W przypadku gdy masz więcej logiki to warto odejść od tego i logikę zapisać ją tak w oderwaniu od bazy.

Implementując szachy nie musisz specjalnie polegać na obiektowości. Ta gra ma zamknięte reguły, więc za bardzo nie skorzystasz na obiektowości i potencjalnych rozszerzeniach jakie mógłbyś w oparciu o klasy czy obiekty zrobić.

Lepiej zrób sobie funkcje, które przyjmują planszę jako argument i które na jej podstawie wykonują zadania. Nie jest to w 100% rozwiązanie najlepsze, ale na tym etapie nie potrzebujesz więcej.

W przypadku django warto uważać, bo stan gry, nawet taki który nie musi być utrwalony, będzie Ci giną w aplikacji co przeładowanie kodu przez django. Musiałbyś co przeładowanie robić odtwarzać stanu planszy z powrotem z bazy (na podstawie ruchów). Tu masz przykład jak dopisać logikę, która się wykona przy przeładowaniu https://stackoverflow.com/a/43593959

Tu dodam, że póki nie robisz optymalizacji z potrzeby to uważaj, aby przy wdrożeniu ograniczyć liczbę instancji tej aplikacji do 1, bo przy większej liczbie instancji aplikacji requesty mogą trafić nie tam gdzie wstępnie zakładasz, a w rezultcie operacje się mogą pomieszać.

Co do modeli to warto wprowadzić 2 zmiany:

  1. aby model Ruch powiązać z modelem odnoszącym się do konkretnej potyczki, bo inaczej ruchy z jednej potyczki zleją Ci się z ruchami z drugiej.
  2. nie warto robić ForeginKey do każdej figury z osobna, nie warto łączyć ruchu z pionkiem bo pionek w trakcie gry zaciera swoją wcześniejszą pozycję, a jak ją usuniesz to wraz z nią przy CASCADE znikną w bazie wszystkie wpisy powiązane z figurą. Lepiej ruch wiązać z typem figury, a wtedy możesz uprościć i informacje o figurach trzymać w jednej tabelce. Albo też skorzystać z jeszcze większego uproszczenia jakie django wprowadza czyli choicesz choices: https://docs.djangoproject.com/en/4.2/ref/models/fields/#django.db.models.Field.choices To podejście pozwoli Ci uniknąć tworzenia tabelek, więc jest szybko i łatwo, ale z drugiej strony to niekorzystnie wpłynie na samą integralność danych (innymi słowy poza aplikacją django, wszyscy ludzie pracujący mający styk z bazą mogą wpisać głupoty w do tabelki z ruchami, a łaza i tak to łyknie). Dobrym podejściem jest postrzeganie bazy nie jako głupiego składowiska danych, a systemu który zabiega (w granicach rozsądku) o poprawność wprowadzonych danych, czy ich aktualizacje.

funkcje jakie mógłbyś mieć to:

  1. game = loads_game(game_id) - wczytuje grę z bazy (gra niech zawiera informację o planszy i o tym, który gracz wykonał ostatnio ruch), w środku tej funkcji robisz wczytanie wszystkich ruchów, a potem nakładasz je na czystą planszę; z czasem jak się projekt rozwinie to możesz zrobić optymalizację, aby stanu gry nie wczytywać z dziennika, ale całościowo np. z bazy podręcznej takiej jak redis
  2. is_allowed_move(move) - ocenia czy ruch jest dopuszczalny, zwraca wartość typu bool
  3. save_move(game_id, move) - gdy wiesz, że ruch został przyjęty wołasz save_move, aby zapisać zmianę (ta część nie jest specjalnie obiektowa, ale też nie ogranicza Ci pola do dalszego rozwinięcia)
edytowany 9x, ostatnio: znowutosamo2
IG
Ok, dziękuję za konkret! Jak to zrobić w takim razie?
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)