ugrás a tartalomhoz

Django modellek megjelenítése az oldalon

ijano · 2010. Jún. 17. (Cs), 16.55
Sziasztok!

Most próbálgatom a Django-t és nem tiszta pár dolog.

Van appom, settings.py, urls.py, admin.py, templates (base.html, cimoldal.html) beállítva.

models.py

from django.db import models

class Who(models.Model):
        body = models.TextField()
A body-t látom az adminban, írni is tudok bele és bele is kerül az adatbázisba.

A "cimoldal.html"-be mit kell írni, hogy kiprintelje?:)

views.py

from django.shortcuts import render_to_response

def Who(request):
    return render_to_response('cimoldal/cimoldal.html',)
Remélem érthető a kérdés, köszönöm.
 
1

Templates

janoszen · 2010. Jún. 17. (Cs), 18.04
Ezt nézted? http://docs.djangoproject.com/en/dev/intro/tutorial03/#intro-tutorial03 (Középtájon lesz a templatekről szó.)
2

Köszönöm

ijano · 2010. Jún. 17. (Cs), 18.35
Sajnos nem értem én ezt:)

"Csak" annyit szerettem volna, hogy amit adminban beírok a body-ba azt lássam a /cimoldal-on
Lehet messze vagyok még a megoldástól, reménykedtem benne, hogy már csak a cimoldal.html-be kell írjak valamit:P

Különböző tutorialokból szedtem össze ami egyelőre van, de tényleg homály sajnos.

settings.py - csak a lényeges részek
import os.path

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates'),
)

INSTALLED_APPS = (
    'django.contrib.admin',
    'kezdet.cimoldal',
)


urls.py
(r'^admin/', include(admin.site.urls)),
    (r'^cimoldal/', 'kezdet.cimoldal.views.Who'),


models.py
from django.db import models

# Create your models here.
class Who(models.Model):
        body = models.TextField()


views.py
from django.shortcuts import render_to_response

def Who(request):
    return render_to_response('cimoldal/cimoldal.html',)


cimoldal.html - Ezt látom is http://127.0.0.1:8000/cimoldal/
{% extends "base.html" %}

{% block title %}Asd{% endblock %}

{% block main %}
  <h1>Asd {{ name }}!</h1>
  <p>
    Asd asd asd asd asd
  </p>
{% endblock %}


Az admin felületen a Who-ban a body-ba tudtam írni és benne is van az adatbázisban. Egyelőre itt tartok.
3

Hiányzik az objektum lekérése

Török Gábor · 2010. Jún. 18. (P), 09.09
Mindent jól csináltál, de pont az a rész hiányzik, ahol a template megkapnál a view-tól a megjelenítendő objektumot. Erre találsz példát a proclub által is hivatkozott Django-gyorstalpalóban a szavazásokat listázó index nézet kifejtésénél.

(A Python névkonvenciója szerint a függvény és metódus nevek „lower_case_with_underscores” stílusban íródnak, ezért a Who nézet helyesen who. A nézetek elnevezései egyébként praktikusan utalnak a funkciójára is. Ha egy konkrét objektumot jelenítesz meg, akkor lehetne who_detail, ha egy listát azokról, akkor who_index a nézet neve.)
from django.shortcuts import get_object_or_404
from django.shortcuts import render_to_response
from django.template import RequestContext

from kezdet.cimoldal.models import Who

def who_detail(request):
    instance = get_object_or_404(Who, pk=1) // 1-es ID-ju `Who` objektum
    return render_to_response('cimoldal/cimoldal.html',
                              {'object_detail': instance},
                              context_instance=RequestContext(request))
Ekkor a template-edben object_detail néven eléred az objektumot. A context_instance megadása nem szükséges, viszont célszerű mindig használni: ennek hatására a sablonod megkap egy rakat „környezeti” változót, így a site neve, aktuálisan belépett user stb.

A fenti megoldást persze lehet még finomítani, hogy URL-ben megkapott azonosítójú objektumot töltse be. Erre egyébként van még egyszerűbb tálalás a generikus nézetek segítségével, erről szól a negyedik fejezet.
4

Köszönöm szépen

ijano · 2010. Jún. 18. (P), 16.31
A views.py jelenleg így néz ki

from django.shortcuts import get_object_or_404
from django.shortcuts import render_to_response
from django.template import RequestContext

from kezdet.cimoldal.models import Who

def who_detail(request):
    instance = get_object_or_404(Who, pk=1)
    return render_to_response('cimoldal/cimoldal.html',
                              {'object_detail': instance},
                              context_instance=RequestContext(request))


A http://127.0.0.1:8000/cimoldal/ ezt adja

Traceback (most recent call last):

  File "/usr/lib/python2.5/site-packages/django/core/servers/basehttp.py", line 280, in run
    self.result = application(self.environ, self.start_response)

  File "/usr/lib/python2.5/site-packages/django/core/servers/basehttp.py", line 674, in __call__
    return self.application(environ, start_response)

  File "/usr/lib/python2.5/site-packages/django/core/handlers/wsgi.py", line 245, in __call__
    response = middleware_method(request, response)

  File "/usr/lib/python2.5/site-packages/django/middleware/common.py", line 84, in process_response
    if response.status_code == 404:

AttributeError: 'Who' object has no attribute 'status_code'


Tudom, hogy még mindig nem értem. Amit írtál views.py az sokat segített, néhány dolog már letisztult:)
5

kisbetűs view

Török Gábor · 2010. Jún. 18. (P), 21.42
Az urls.py-ban is javítottad a nézet nevét kisbetűsre?
6

Nem

ijano · 2010. Jún. 18. (P), 22.23
Szégyenlem de nem volt, pedig írtad a kisbetűs nézeteket.

Viszont még mindig nem sikerül,:)

Exception Type:
ViewDoesNotExist

Exception Value:
Tried who in module kezdet.cimoldal.views. Error was: 'module' object has no attribute 'who'
7

urls.py

ijano · 2010. Jún. 19. (Szo), 17.55
Most már látom a cimoldal.html oldalam.

A detail-t nem írtam ki a who után.
(r'^cimoldal/', 'kezdet.cimoldal.views.who_detail'),


A cimoldal.html-ben hogyan is érem el az object_detail-t?
Próbáltam a for in-el de nem sikerül:)
8

Sikerült

ijano · 2010. Jún. 19. (Szo), 21.30
{{ object_detail.body }}


Köszönök minden segítséget!:)