Pereiti prie turinio

Django dinaminės formos ir jų išsaugojimas DB


Rekomenduojami pranešimai

Sveiki,

turiu tokią užduotį: yra daug daiktų ir kiekvienas iš jų turi savo savybių sąrašą. Reikia sukurti tokią dinaminę įvedimo formą, kurioje turėtų būti galimybė įvesti daikto pavadinimą ir visas jo savybes. Problema man iškilo tame, kad skiriasi kiekvieno daikto savybių sarašo ilgis ir forma negali būti stacionari. Taigi, ji turi turėti galimybę pridėti tiek input laukų, kiek reikia, bei paskui visa tai išsaugoti DB. Bandžiau nagrinėti klasę Form, bet nepavyksta rasti atsakymo. Gal čia kas nors padės surasti kelią. Iš anksto dėkui.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Galimi keletas variantu:

 

1. Jeigu savybes kiekvienam daiktui unikalios.

 

Du modeliai: Daiktas ir Savybe. Pastaroji turi foreignkey i Daiktas.

 

admin.py apibrezi SavybeInline ir pridedi prie DaiktasAdmin inlines list'o.

 

2. Jeigu savybes kartojasi.

 

Trys modeliai: Daiktas, Savybe ir DaiktoSavybe.

 

Daiktas turi m2mf i Savybe through DaiktoSavybe (jei nesuprasi, sakyk)

 

Ar imanoma si varianta padaryti patogu valdyti per django admin, reikia pasidometi.:)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui už patarimus. Rusų forumuose aš radau kitokį sprendimo būdą ir pritaikiau jį sau. Įdomu būtų sužinoti daugiau išmanančių žmonių nuomonę, kas čia labiau tinka:

 

function addInput2() {
   var id = document.getElementById("default-id").value;
   id++;
   $("#add_tb").append('<tr id="tr-' + id + '"><td><input type="text" name="savybe' + id + '" id="id_savybe' + id + '" size="30"><a href="javascript:{}" onclick="removeInput2(\'' + id + '\')">Pašalinti</a></td></tr>');
   document.getElementById("default-id").value = id;
}

function removeInput2(id) {
   $("#tr-"+id).remove();

 

 

<div id="content">
       <div id="text">
           <h3> Šablono pavadinimas </h3>
           <form name="testform" action="/sablonai/" method="POST">{% csrf_token %}
               <table id="add_tb">
                   <tr>
                       <td>
                           <input id="sablonas" type="text" size="30" value="" name="sablonas"/>
                       </td>
                   </tr>
                   <tr>
                       <td>
                           <h4>Savybės:</h4>
                           <input type="hidden" id="default-id" value="1">
                       </td>
                   </tr>
                   <tr id="tr-1">
                       <td>
                           <input type="text" name="savybe1" id="id_savybe1" size="30">
                       </td>
                   </tr>
               </table>
               <a href="javascript:{}" onclick="addInput2()">Dadėti savybių lauką</a><br>
               <input type="submit" value="Patvirtinti">
           </form>
       </div>
   </div>

 

 

def sablonai(request):    
   if request.method == 'POST':
       form = request.POST
       a = Sablonai(pavadinimas=form['sablonas'])
       a.save()
       return render_to_response('rezultatas.html', {'form': form}, context_instance=RequestContext(request))

   return render_to_response('sablonai.html', {'form': form}, context_instance=RequestContext(request))

http://romka.eu/blog/dinamicheskoe-dobavlenie-elementov-k-forme

 

p.s. Dar nesugalvojau, kaip išrankioti visus inputus iš POST ir juos surašyti į savybių DB.

Redagavo meshkis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Formsetus irgi įmanoma dinamiškai pridedinėti su JS. http://stackoverflow.com/questions/501719/dynamically-adding-a-form-to-a-django-formset-with-ajax

 

 

p.s. Dar nesugalvojau, kaip išrankioti visus inputus iš POST ir juos surašyti į savybių DB.

Nelabai net įsivaizduoju, ką reikėtų sugalvoti – POST yra paprasčiausias žodynas (dictionary), per kurį iteruoji, ieškodamas sau reikiamų argumentų ir kiekvienam kuri po naują įrašą. :)

 

Beje, tavo view'e du tokie patys return, tą iš if gali šalinti – vis tiek bet kokiu atveju įsivykdys už jo einantis.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tiesa pasakius, tau patogiau butu naudoti pirma mano pateikta buda ir django admin interface.:)

Dėkui už patarimą, bet django admin interface nenoriu naudoti dėl to, kad mano tikslas yra išmokti Python/Django. O padaręs savo adminą aš įgausiu patirties, nors gal ir prireiks daug prakaito išlieti. Sunku pratybose, lengva mūšyje. :)

 

Dar noriu paklausti:

Čia matau patarimus naudoti Django ORM ir ryšius tarp lentelių: ManyToManyField, ForeignKey.

Iki šiol aš naudojau tik tiesiogines SQL užklausas ir šitų ryšių nenaudojau. Bet dabar atsiranda problemų su duomenų trynimu, pildymu. Pavyko išsiaiškinti, kad tai dėl MySQL varikliuko InnoDB. Tai supratau, kad man reikia arba keisti MySQL varikliuką, arba pereiti prie Django ORM. Kuris sprendimas geresnis?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Formsetus irgi įmanoma dinamiškai pridedinėti su JS. http://stackoverflow.com/questions/501719/dynamically-adding-a-form-to-a-django-formset-with-ajax

 

 

 

Nelabai net įsivaizduoju, ką reikėtų sugalvoti – POST yra paprasčiausias žodynas (dictionary), per kurį iteruoji, ieškodamas sau reikiamų argumentų ir kiekvienam kuri po naują įrašą. :)

 

Beje, tavo view'e du tokie patys return, tą iš if gali šalinti – vis tiek bet kokiu atveju įsivykdys už jo einantis.

 

Apie formsetus nieko nežinojau iki šiol. Dėkui už nuorodą, ji labai padėjo. Pavyko viską pasidaryti pasinaudojus šiuo instrumentu: http://code.google.com/p/django-dynamic-formset/.

Dar iškilo klausimas. Kaip sužinoti, kokį unikalų id lentelėje Sablonai gaus įrašas, kad paskui aš jį galėčiau panaudoti įrašant savybes?

 

def sablonai(request):
   if request.method == 'POST':
       sablonas_formset, savybes_formset = SablonasFormset(request.POST, prefix='sablonas_formset'), SavybesFormset(request.POST, prefix='savybes_formset')
       if sablonas_formset.is_valid() and savybes_formset.is_valid():
           sablonas_data = sablonas_formset.cleaned_data
           a = Sablonai(pavadinimas=sablonas_data[0]['sablono_pavadinimas'])
           a.save()
           savybes_data = savybes_formset.cleaned_data
           for form_data in savybes_data:
               a = Sablono_savybes(savybes_pav=form_data['sablono_savybe'],
                                   sablonas = id? )
               a.save()
           return render_to_response('rezultatas.html', {'sablonas_data': sablonas_data, 'savybes_data': savybes_data}, context_instance=RequestContext(request))
   else:
       sablonas_formset, savybes_formset = SablonasFormset(prefix='sablonas_formset'), SavybesFormset(prefix='savybes_formset')
   return render_to_response('sablonai.html', {'sablonas_formset': sablonas_formset, 'savybes_formset': savybes_formset},
       context_instance=RequestContext(request))

 

Models.py

class Sablonai(models.Model):
   pavadinimas = models.CharField(max_length=64)

class Sablono_savybes(models.Model):
   sablonas = models.IntegerField(max_length=3)
   savybes_pav = models.CharField(max_length=32)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui už patarimą, bet django admin interface nenoriu naudoti dėl to, kad mano tikslas yra išmokti Python/Django. O padaręs savo adminą aš įgausiu patirties, nors gal ir prireiks daug prakaito išlieti. Sunku pratybose, lengva mūšyje. :)

Tam ir skirtas Django built-in admin, kad būtų lengviau bei greičiau administruoti puslapius, tačiau jeigu nenori jo naudoti - tavo pasirinkimas.

 

Apie formsetus nieko nežinojau iki šiol. Dėkui už nuorodą, ji labai padėjo. Pavyko viską pasidaryti pasinaudojus šiuo instrumentu: http://code.google.c...namic-formset/.

Dar iškilo klausimas. Kaip sužinoti, kokį unikalų id lentelėje Sablonai gaus įrašas, kad paskui aš jį galėčiau panaudoti įrašant savybes?

Na nežinau, ar suprasi, ką parašysiu, bet pasistengsiu aiškiai, bet be pavyzdžių.

 

Kiekvienąsyk savo admin'e paspaudęs Pridėti šabloną saugok skaičių, kiek tų šablonų jau yra sukuriama. Prie kiekvieno šablono savybės saugok įrašo, kuriam savybė yra sukuriama, indeksą nuo 0.

 

Serverio pusėje visus sukurtus šablonus sudėk į list'ą: katik_sukurti_sablonai = [sablonasA, SablonasB, SablonasC]

 

Savybes priskyrinėk šablonui sablonas = katik_sukurti_sablonai[indeksas]

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na taip, su supratimu, sudėtinga. O jeigu panaudoti tokį būdą:

Įrašius šablono pavadinimą į lentelę, iš karto daryti paiešką to šablono, ir tada sužinosiu jo id lentelėje. O tuomet jau galėsiu jį pridėti įrašinėdamas savybes? Ar toks būdas racionalus?

 

if sablonas_formset.is_valid() and savybes_formset.is_valid():
           sablonas_data = sablonas_formset.cleaned_data
           a = Sablonai(pavadinimas=sablonas_data[0]['sablono_pavadinimas'])
           a.save()

           sablono_id = darau paieška pagal 'sablono_pavadinimas'

           savybes_data = savybes_formset.cleaned_data
           for form_data in savybes_data:
               a = Sablono_savybes(savybes_pav=form_data['sablono_savybe'],
                                   sablonas =  sablono_id ?  )
               a.save()

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na taip, su supratimu, sudėtinga. O jeigu panaudoti tokį būdą:

Įrašius šablono pavadinimą į lentelę, iš karto daryti paiešką to šablono, ir tada sužinosiu jo id lentelėje. O tuomet jau galėsiu jį pridėti įrašinėdamas savybes? Ar toks būdas racionalus?

 

Į šitą klausimą pačiam pavyko rasti atsakymą. Pasirodo, metodas save() po įvykdymo gauna atributą 'id', kuris ir yra unikalus įrašo numeris.

Redagavo meshkis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Į šitą klausimą pačiam pavyko rasti atsakymą. Pasirodo, metodas save() po įvykdymo gauna atributą 'id', kuris ir yra unikalus įrašo numeris.

 

Aš truputį ne taip supratau tavo problemą. :) Galvojau tu viena forma sukurinėji n šablonų ir dar daugiau savybių ir nori žinoti, kurios savybės kuriam šablonui priklauso. :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...