Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, reikia pagalbos

 

HTML`e yra meniu. Kiekvienas meniu punktas turi savo `id`. Paspaudus ant meniu punkto, `id` perduodamas į `views.py` ir ten apdorojamas.

 

<a href="{% url es_app.views.vnz name=menu_id %}" title="{{ pavadinimas }}"> 
   <span>{{ pavadinimas }}</span>
</a>

 

Klausimas tame, kad taip perduodant 'id' jis matosi ir adreso eilutėje. Gaunasi: 'domenas/vnz/1/'. O man reikia, kad gautųsi: 'domenas/vnz/grazus_pavadinimas/'.

Išanksto dėku.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Hm, nelabai suprantu, kame užstrigai. Dabar, tarkim, turi savo viewą ir urlconf'ą:

def vnz(request, id):
   Modelis.objects.get(id=id)
   ...

url(r'^vnz/(?P<name>\d+)/$', vnz)

 

Tai vietoj to pasidarai, kad urlconfas imtų ne id, o slug'ą (kitoks patternas), o viewas ieškotų būtent pagal tą slugą, ne ID.

 

def vnz(request, slug): 
   Modelis.objects.get(slug=slug)
   ...

url(r'^vnz/(?P<slug>[A-Za-z0-9-]+)/$', vnz) 

 

Čia iš akies parašiau abu regexus, bet esmė tokia :) Nebent ta tavo meniu logika yra iš kokio nors 3rd-party app, tada kitas reikalas.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui už atsakymus.

Parašysiu pilnai, dėl ko šis klausimas man iškilo.

Aš iki šiol darydavau taip:

 

class skyriai(models.Model):
  id = unikalus, automatinis
  darbinis_pav = models.CharField(max_length=48)    
  pavadinimas = models.CharField(max_length=64)

class tekstai(models.Model):
  id = unikalus, automatinis
  skyrius_pav = models.CharField(max_length=48)

 

meniu formuodavau taip:

 

<a href="{% url es_app.views.vnz name=darbinis_pav %}" title="{{ pavadinimas }}">
   <span>{{ pavadinimas }}</span>
</a>

 

perduodamas 'darbinis_pav' gaudavau url kokį norėdavau, paieška db 'tekstai' vykdavo 'skyrius_pav = darbinis_pav' ir viskas buvo gerai. Bet dabar sulaukiau daug kritikos, kad tai neprofesionalu ir, kad viskas turi vykti pagal unikalius 'id', būtent juos reikia perduoti, taip išvengiama klaidų ir t.t. Tai ir pradėjau ieškoti profesionalumo. :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na logiška, kad įrašus gali identifikuoti tik pagal unikalius parametrus (arba parametrų kombinacijas). Tavo naudojamas laukas `darbinis_pav` tikrai šio reikalavimo neatitinka, nes niekas nedraudžia jam patapti neunikaliu, o tada jau nebežinosi, kuris objektas tave domina.

 

ID yra dažnai negražu - sutinku, tam tikslui yra naudojami slug'ai. Kad suprastum, kas tai yra, gali pasiskaityti čia.

Django modeliuose jie apibrėžiami paprastai:

 

from django.db import models
from django.utils.text import slugify

class MyModel(models.Model):
   title = models.CharField(max_length=40) 	
   # https://docs.djangoproject.com/en/dev/ref/models/fields/#slugfield
   slug = models.SlugField(unique=True, max_length=40, editable=False)    # atkreipk dėmesį į unique=True, jis neleidžia šio lauko dublikatų duombazės lygmenyje 

   def save(*args, **kwargs):
       # Išsaugant nustatome slug reikšmę. Paprastai, django savo įrankiuose turi funkciją slugify, kuri iš tavo turimo teksto padaro slug'ą, kurį gali gražiai įterpti į url, tačiau slug'ai gali sutampi, tokiu atveju turi gale pridėti kokį skaičiuką slugas-1, slugas-2 ir pan. Šio atveju čia nenagrinėsiu, tad pasinaudosime django turimais standartiniais įrankiais.
       # https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.text.slugify
       self.slug = slugify(self.title)
       super(MyModel, self).save(*args, **kwargs)

 

Na ir viskas, dalį su adresais Silkė tau jau paaiškino.

Redagavo aemdy
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nieko nėra „neprofesionalaus“, kai url tik slug'as, o ID nėra. O didžiausia klaida, kokia čia gali būti, tai turbūt ir yra slugų susidublikavimas, bet pasirašius kelias eilutes .save() metode, galima to išvengti. Jei tingi rašyti pats, gali, pvz., pasinaudoti django-autoslug. https://django-autoslug.readthedocs.org/en/latest/index.html

 

Tiesa, dar gali turėti URL, kuriame būtų IR id, IR pavadinimas. Ieškotum pagal ID, o pavadinimo niekur nenaudotum, bet vis tiek įkištum į URL – dėl grožio, SEO ir pan. T.y., turėtum kažką tokio:

/vnz/1/pavadinimas/

Toks metodas irgi daug kur naudojamas (netgi ir uždarby).

 

Tiesa, šiek tiek atkreipk dėmesį į kodo stilių.

class Skyrius(models.Model):

class Tekstas(models.Model):

O dar geriau, jei angliškai :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui už pamokymus. Apie 'slug' iki šiol nieko nebuvau girdėjęs.

 

Paskaitinėjęs apie 'slug' susidariau nuomonę, kad jo veikimo principas panašus kaip mano naudotas, aukščiau aprašytas 'darbinis_pav'. Tik jis yra profesionalus Django įrankis, kuris turi naudingų savybių, tokių kaip unikalumas, autoformavimas ir t.t. Bet jo bazinė paskirtis - perduoti kintamąjį, kuris suformuotų 'url' tokį kokio norime. Taigi, mano atveju gaunasi, kad aš grįžtu prie to paties. T.y. turiu db lentelėje sukurti atskirą lauką papildomam indentifikatoriui (nors jau turiu unikalu 'id'). Tada iš 'template' perduoti tą papildomą indentifikatorių, 'views' atlikti papildomą paiešką, kad gauti paspausto meniu punkto unikalų 'id' ir jau tada su šiuo 'id' atlikti veiksmus, kokius reikia. Jei ne taip kažką supratau, pataisykit.

 

p.s. Įdomu, ar nėra kažkokio tobulesnio sprendimo būdo, kuris nereikalautų papildomu veiksmų?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nieko nėra „neprofesionalaus“, kai url tik slug'as, o ID nėra. O didžiausia klaida, kokia čia gali būti, tai turbūt ir yra slugų susidublikavimas, bet pasirašius kelias eilutes .save() metode, galima to išvengti. Jei tingi rašyti pats, gali, pvz., pasinaudoti django-autoslug. https://django-autoslug.readthedocs.org/en/latest/index.html

 

Tiesa, dar gali turėti URL, kuriame būtų IR id, IR pavadinimas. Ieškotum pagal ID, o pavadinimo niekur nenaudotum, bet vis tiek įkištum į URL – dėl grožio, SEO ir pan. T.y., turėtum kažką tokio:

/vnz/1/pavadinimas/

Toks metodas irgi daug kur naudojamas (netgi ir uždarby).

 

Tiesa, šiek tiek atkreipk dėmesį į kodo stilių.

class Skyrius(models.Model):

class Tekstas(models.Model):

O dar geriau, jei angliškai :)

 

Kol rašiau savo pranešimą, matau, kad buvo atsakyta į mano klausimą. Tik šitame sprendime yra vienas blogumas. Žiūrint iš SEO pusės, tai kiekviena url'o dalis turi savo svarbą, kuri mažėja iš kairės į dešinę.

/vnz/1/pavadinimas/

Šiame pavyzdyje '1' gaus didesnę svarbą nei 'pavadinimas', o tai dėl SEO nėra gerai, nes kartais mažiausia smulkmena leidžia aplenkti konkurentą. :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Parašysiu, ką aš turėjau omenyje sakydamas profesionalumas/neprofesionalumas.

Man yra tekę dirbti projektuose, kur prieš rašant kodą, būdavo surašomi naudojami metodai, algoritmai, komandos, tada surandamos alternatyvos. Viskas įvertinama paskaičiavus veikimo laikus iki mikrobinių sekundžių dalių, o tada parenkamas optimaliausias variantas. Ir aš niekaip nepriprantu prie webprogramotuojų dažno posakio: "Viena užklausa daugiau ar mažiau, koks skirtumas. Pažiūrėk didelius projektus, pamatysi, kiek ten užklausų." O jei iš to daugiau - mažiau susidaro kritinė masė?

Šia temą sukūriau todėl, kad suabejojau, ar mano naudojams metodas yra optimalus. Ir dar tikriausiai ne vieną sukursiu :). Ir aš tikiuosi, kad šitos temos ne man vienam atneš naudos, nes surasti informacijos, kur būtų parašyta viskas detaliai nuo pradžiu iki galo, sudėtinga. Kai reikia kažką surasti, randi daug, bet dažniausiai kalba ten prasideda nuo vidurio, o likusią pusę jau turi žinoti. O dažnai būna, kad tos pusės kaip tik ir nežinai, nes tai tavo pirmieji žingsniai.

Redagavo meshkis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kol rašiau savo pranešimą, matau, kad buvo atsakyta į mano klausimą. Tik šitame sprendime yra vienas blogumas. Žiūrint iš SEO pusės, tai kiekviena url'o dalis turi savo svarbą, kuri mažėja iš kairės į dešinę.

/vnz/1/pavadinimas/

Šiame pavyzdyje '1' gaus didesnę svarbą nei 'pavadinimas', o tai dėl SEO nėra gerai, nes kartais mažiausia smulkmena leidžia aplenkti konkurentą. :)

Nenusimanau SEO subtilybėse :) Bet šiuo atveju galima lengvai apkeist ir turėti

/vnz/pavadinimas/1/

 

Parašysiu, ką aš turėjau omenyje sakydamas profesionalumas/neprofesionalumas.

Man yra tekę dirbti projektuose, kur prieš rašant kodą, būdavo surašomi naudojami metodai, algoritmai, komandos, tada surandamos alternatyvos.

Yra tiesos, tačiau yra ir kita medalio pusė – daug kas mėgsta sakyti „premature optimization sucks“. T.y. optimizuok, kai matai, kad jau tikrai negerai ir optimizuok būtent tą, kas yra didžiausias kaltininkas, o ne kiekvieną vietą, kur gali sutaupyti mikrosekundžių, aukojant aiškumą, draugiškumą, ir t.t. Aišku, kiekvienoje srityje kitaip – jei programuoji mikrokontroleriui, tai kaip gi nerūpės sutaupyti kiekvieną baitą... :)

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.

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