Tomasz K.

Tomasz K. programista

Temat: widoki generyczne list_detail

Hej,
Jestem poczatkujacym w django, mam 2 pytania:

1. Użyłem object_list do wyswietlania newsów:

urls.py:

from django.conf.urls.defaults import patterns, include, url
from django.views.generic.list_detail import object_list, object_detail

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

from naukadjango.newsy import views
from naukadjango.newsy.models import News

urlpatterns = patterns('',
url(r'^newsy/$', object_list, {
'queryset':News.objects.all(),
'paginate_by':2,
'template_name':'news/index.html',
})
url(r'^admin/', include(admin.site.urls)),
)

I działa, ale czy owe parametry (paginate_by, template_name) nie powinno się pobierać w definicji funkcji w views.py?

2. Do wyświetlania danych o konkretnym newsie użyłem składni:

url(r'^news/details/(?P<id>\d+)/$', object_detail, {
'queryset':News.objects.all(),
'template_name':'news/detail.html'})

Czyli można powiedzieć, że analogicznie do powyższego, ale z użyciem object_detail, z tym że wyskakuje mi błąd:
Exception Value:

object_detail() got an unexpected keyword argument 'id'

Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response, line 111

Rozumiem, że jakoś url nie otrzymuje tego id, ale myslalem, ze jak poda się go w wyrażeniu regularnym to już go przyjmie. Ale jednak tego nie robi. Próbowałem dodać do słownika parę 'object_id': id, ale nie działa.

Jak sprawić, aby przyjęło to id z url'a?

Korzystałem z tego tutoriala: http://www.python.rk.edu.pl/w/p/generyczne-widoki/
tyle że tam jest object_detail oparty o slug, a u mnie o id.
Czyżby ten tutorial był mocno przestarzały?

Bede wdzieczny za wskazówki, dzięki.
Daniel K.

Daniel K. Programista Python,
dcs.pl Sp. z o.o.

Temat: widoki generyczne list_detail

ad 2)
zmień:

url(r'^news/details/(?P<id>\d+)/$', object_detail, {
'queryset':News.objects.all(),
'template_name':'news/detail.html'})

na:

url(r'^news/details/(?P<object_id>\d+)/$', object_detail, {
'queryset':News.objects.all(),
'template_name':'news/detail.html'})

Powinno zadziałać
Przemysław Kołodziejczyk

Przemysław Kołodziejczyk Python/Web Developer

Temat: widoki generyczne list_detail

Tomek K.:
Hej,
Jestem poczatkujacym w django, mam 2 pytania:

1. Użyłem object_list do wyswietlania newsów:

urls.py:

from django.conf.urls.defaults import patterns, include, url
from django.views.generic.list_detail import object_list, object_detail

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

from naukadjango.newsy import views
from naukadjango.newsy.models import News

urlpatterns = patterns('',
url(r'^newsy/$', object_list, {
'queryset':News.objects.all(),
'paginate_by':2,
'template_name':'news/index.html',
})
url(r'^admin/', include(admin.site.urls)),
)

I działa, ale czy owe parametry (paginate_by, template_name) nie powinno się pobierać w definicji funkcji w views.py?

Jeśli używasz "generic views" to nie potrzebne Ci widoki. Masz zapytanie, ilość wyników dla stronicowania, nazwę szablonu. Czego więcej potrzeba? ;-) Szybko i bez pisania dużej ilości kodu. Jak to jest napisane w dokumentacji django:

"Writing Web applications can be monotonous, because we repeat certain patterns again and again. In Django, the most common of these patterns have been abstracted into “generic views” that let you quickly provide common views of an object without actually needing to write any Python code."

W ogóle to polecam zapoznać się też z widokami opartymi na klasach - https://docs.djangoproject.com/en/dev/topics/class-base... Mają one zastapić całkowicie powyższy sposób ;-)
Tomasz K.

Tomasz K. programista

Temat: widoki generyczne list_detail

Daniel K.:
ad 2)
zmień:

url(r'^news/details/(?P<id>\d+)/$', object_detail, {
'queryset':News.objects.all(),
'template_name':'news/detail.html'})

na:

url(r'^news/details/(?P<object_id>\d+)/$', object_detail, {
'queryset':News.objects.all(),
'template_name':'news/detail.html'})

Powinno zadziałać

Dziala, dzieki :)

Zanim podpowiedziales mi probowalem to przejsc poprzez wstawienie id do warunku w News.object.filter('object_id'=id) .. oczywiscie nie zadzialalo, ale zastanowił mnie fakt - dziwny i troche nielogiczny, że skoro podaje się id jako parametr w wierszy wyrazenia regularnego to jaki sens jest jest tworzyc querySeta, a tym bardziej, ktory przeszukuje wszystkie wiersze .all() ? A nawet jesliby uzyc filter albo exclude to nadal nie widze sensu skoro podane jest id, ktore jest unikalne dla kazdego wiersza.. Może się czepiam, ale czy nie zastanawiało to Was kiedykolwiek?

Pozdrawiam
Tomasz K.

Tomasz K. programista

Temat: widoki generyczne list_detail

W ogóle to polecam zapoznać się też z widokami opartymi na klasach - https://docs.djangoproject.com/en/dev/topics/class-base... Mają one zastapić całkowicie powyższy sposób ;-)

Mają one zastąpić czy już zastąpiły?
Daniel K.

Daniel K. Programista Python,
dcs.pl Sp. z o.o.

Temat: widoki generyczne list_detail

Tomek K.:
W ogóle to polecam zapoznać się też z widokami opartymi na klasach - https://docs.djangoproject.com/en/dev/topics/class-base... Mają one zastapić całkowicie powyższy sposób ;-)

Mają one zastąpić czy już zastąpiły?

Najlepiej używać już widoków opartych na klasach. Stare podejście ( oparte na funkcjach ) ma zostać w kolejnych wersjach django porzucone ( nie pamiętam dokładnie od której wersji ).
Daniel K.

Daniel K. Programista Python,
dcs.pl Sp. z o.o.

Temat: widoki generyczne list_detail

Tomek K.:

Dziala, dzieki :)

Zanim podpowiedziales mi probowalem to przejsc poprzez wstawienie id do warunku w News.object.filter('object_id'=id) .. oczywiscie nie zadzialalo, ale zastanowił mnie fakt - dziwny i troche nielogiczny, że skoro podaje się id jako parametr w wierszy wyrazenia regularnego to jaki sens jest jest tworzyc querySeta, a tym bardziej, ktory przeszukuje wszystkie wiersze .all() ? A nawet jesliby uzyc filter albo exclude to nadal nie widze sensu skoro podane jest id, ktore jest unikalne dla kazdego wiersza.. Może się czepiam, ale czy nie zastanawiało to Was kiedykolwiek?

Pozdrawiam

QuerySet w django ma "leniwą" naturę. To, że podajesz do parametru urla, queryseta z warunkiem .all() nie znaczy, że takie zapytanie trafi do bazy. Jest to tylko hmm początkowy zbiór danych z których wybrany zostanie ten jeden interesujący Cię obiekt. Możesz np. dać w urlu, że ma wybierać tylko spośród opublikowanych newsów.
Zapytanie jest wysyłane dopiero w momencie np iteracji po wynikach querysta, wcześniej możesz go dowolnie (prawie) modyfikować.
Robiąc coś takiego np.:
queryset = queryset.filter(active=True)
object = queryset.get(pk=object_id)
w kolejnych krokach budujesz warunki ograniczające ( to co trafi do WHERE).



Wyślij zaproszenie do