Django ModelForm - Există o modalitate de a defini câmpurile dinamic, dar nu ca ultimul câmp?

Am un ModelForm cu Django 2.1 și am mutat câteva câmpuri într-un alt model. Apelarea make_migrations provoacă o eroare deoarece aceste câmpuri nu există în modelul curent. Am adăugat câteva dintre câmpuri la formular, dar unul dintre câmpuri este TranslatedField (de la django-translated-fields) și, prin urmare, există în prezent 2 câmpuri, iar în viitor ar putea fi mai multe, în funcție de numărul de limbi. Numele câmpului este oraș și, în prezent, primesc un mesaj de eroare „Câmpuri necunoscute (oraș_ro, oraș_he) specificate pentru SiteProfile” (deoarece folosesc 2 limbi - „en” și „el”) - dar vreau să creez toate câmpurile dinamic cu o buclă for peste limbile pe care le folosim în proiect. Pot suprascrie (și este o metodă bună de programare) metoda __new__ sau există o altă modalitate? Prefer să nu codez numele câmpurilor specifice (city_en și city_he), deoarece acestea se pot schimba în viitor, în funcție de câte limbi folosim.

modelform

Puteți vedea confirmarea mea actuală (care nu funcționează) pe GitHub.

Și codul actual al acestei ramuri.

Aș dori să știu care este cea mai bună metodă de programare pentru a defini o listă dinamică de câmpuri (care sunt toate identice și numai unul dintre ele va fi utilizat, celălalt este eliminat în metoda __init__) într-un ModelForm în care câmpurile sunt salvate într-un alt model (există 2 modele, dar o singură formă).

Încă nu am comis migrațiile din cauza acestei erori la executarea make_migrations.

(Am definit o comandă make_migrations care nu face decât migrarea)

Formularul (încercând să anulez __new__):

Actualizare 1: Mă gândesc să definesc aceste câmpuri în metoda __init__ în timp ce le elimin din câmpurile din clasa Meta, dar este o abordare bună? Pentru a defini câmpurile care nu sunt în lista câmpurilor ?

Django avertizează împotriva definirii câmpurilor nu în mod explicit.

Este recomandat să setați în mod explicit toate câmpurile care ar trebui editate în formular folosind atributul câmpuri. Nerespectarea acestui lucru poate duce cu ușurință la probleme de securitate atunci când un formular permite în mod neașteptat utilizatorului să seteze anumite câmpuri, mai ales atunci când câmpurile noi sunt adăugate la un model. În funcție de modul în care este redat formularul, este posibil ca problema să nu fie chiar vizibilă pe pagina web.

Abordarea alternativă ar fi includerea automată a tuturor câmpurilor sau doar lista neagră a câtorva. Se știe că această abordare fundamentală este mult mai puțin sigură și a condus la exploatări serioase pe site-uri web importante (de exemplu, GitHub).

Vreau să știu dacă există o soluție fără codificarea dură a limbilor. În prezent, am codificat limbile:

Actualizare 2: Am aflat că pot adăuga acest câmp dinamic adăugând această linie în metoda __init__ a formularului:

Și apoi scoateți-l din lista câmpurilor din clasa Meta și din definiția codificată din formular în sine. Dar, câmpul este creat ca ultimul câmp din formular și vreau să fie în mijloc. Există o modalitate de a adăuga acest câmp în mijloc?

Actualizare 2: . Dar, câmpul este creat ca ultimul câmp din formular și vreau să fie în mijloc. Există o modalitate de a adăuga acest câmp în mijloc?

Dacă field_order este o listă de nume de câmpuri, câmpurile sunt ordonate așa cum se specifică în listă și câmpurile rămase sunt adăugate conform ordinii implicite. .

Puteți rearanja câmpurile oricând folosind order_fields () cu o listă de nume de câmpuri, ca în field_order .

Crearea de forme dinamice cu Django, Formularele dinamice trebuie să schimbe numărul de câmpuri pe care le au în timpul rulării, știți câte câmpuri are, ce tipuri sunt și cum sunt siguri că nu se repetă verificând că nu există duplicate. pentru acest întreg comportament re-conectat la clonă în locul ultimului câmp original din listă. Dacă oricare dintre acestea sunt utilizate, ordinea în care câmpurile apar în formular va fi ordinea în care câmpurile sunt definite în model, instanțele ManyToManyField apărând ultima. În plus, Django aplică următoarea regulă: dacă setați editable = False în câmpul model, orice formular creat din model prin ModelForm nu va include acel câmp.

Nu știu dacă acest lucru va ajuta, dar am o aplicație de sondaj în care diferiți utilizatori doresc informații diferite pe formularul de informații de fundal. Îl furnizez printr-un fișier json. Deci, în forma pe care o am

Fișierul meu JSON va arăta ca:

Tasta de câmp este un câmp de intrare, la fel ca elementele din lista div. În acest caz, când câmpul este selectat (BooleanField), câmpurile din lista div trebuie completate, ceea ce fac prin metoda curată.

Toate câmpurile mele sunt specificate în cadrul modelului, astfel încât să puteți alege și alege ce câmpuri să utilizați

Crearea formularelor din modele | Documentația Django, Este recomandat să setați în mod explicit toate câmpurile, permițând utilizatorului să seteze anumite câmpuri, mai ales atunci când câmpurile noi sunt adăugate la un model. În funcție de modul în care este redat formularul, problema nu poate fi creată nici măcar din model prin ModelForm, nu va include acel câmp. Dacă ambele definesc câmpuri, ModelAdmin suprascrie. Cu ramura așa cum este, dacă creați un ModelForm care urmează să fie utilizat pentru administrator, nota: 1) Dacă definiți Meta interioară și setați „model”, trebuie să setați și „câmpuri” (sau „excludeți” '), dar valoarea sa va fi ignorată dacă setați câmpurile în vreun fel în ModelAdmin.

Este foarte greu să înțelegi cu ce anume ai o problemă. Ar fi foarte util dacă ați putea răspunde la întrebări și ați pune mai jos.

Mut câteva câmpuri la un alt model

Ce domenii? Din ce model? La ce model? Presupun că mutați câmpul orașului de la modelul utilizatorului la SiteProfile .

Apelarea make_migrations provoacă o eroare deoarece aceste câmpuri nu există în modelul curent

Ce eroare? La ce se referă modelul actual? SiteProfile? Ar trebui să fie perfect realizabil să mutați câmpul de la un model la altul.

M-am uitat în jurul depozitului dvs. Mai ales ramuri în care ați încercat să migrați de la django-modeltranslation la django-translated-fields. Și am găsit, de asemenea, problema dvs. în depozitul de câmpuri traduse django de pe Github.

Din păcate, nu sunt capabil să înțeleg pe deplin care este problema pe care o aveți. Cred că problema dvs. poate fi împărțită în două independente.

  1. Migrația nu funcționează pentru câmpurile traduse django
  2. Crearea dinamică a câmpurilor traduse în formulare.

Deci poate putem începe cu migrația. Ce vrei să spui când spui că migrația nu funcționează. Îmi puteți arăta erorile?

# 12238 (ModelAdmin ignoră câmpurile dinamice ale ModelForm) - Django, Dacă unul dintre aceste câmpuri este adăugat la Meta ModelForm, câmpul apare foarte bine. Vizualizați formularul (notați fără modificări); Actualizați Meta.fields ModelForm pentru a include "xyz" def get_fieldsets (self, request, obj = None): "Cârlig pentru specificarea seturilor de câmpuri pentru cea mai recentă versiune funcționează, dar se simte ca un mod foarte prost de a face lucrurile. Pentru a afișa câmpul Array în Django Admin, trebuie să fie prezent un formular pentru câmp. Deoarece matricea este alcătuită din modele de autor abstracte, formularul poate fi creat cu ușurință utilizând un ModelForm. Dacă nu specificați un ModelForm pentru modelele dvs. de matrice în argumentul model_form_class, Djongo va genera automat un ModelForm pentru dvs.

Dacă doriți ca toate câmpurile modelului din ModelForm să fie dinamice ori de câte ori schimbați modelul, puteți verifica acest lucru. (Am încercat, funcționează.)

în forms.py

----- Avertisment mare-------

se va afișa o eroare cu câmpurile care nu se pot edita precum (dacă puteți schimba funcția pentru a exclude acest tip de câmpuri, vă rugăm să editați răspunsul.):

dacă eliminați auto_now_add = True din aceasta, va funcționa.

Notă

se va crea o listă derulantă pentru ForiegnKeyField cu toate opțiunile.