Форум сайта python.su
Здравствуйте. В документации есть ответ на мой вопрос, но оно не работает. Нужно во вьюху передать id записи в таблице через URL такого вида: /update/15 (15 - это и есть ИД). Делаю как описано в документации. Но… Не работает. В urls.py написано так:
('^update/\d+$', update_channel),
def update_channel(request, channelid):
channel_id=int(channelid)
create_list('single', '/tmp/db_fake_dump', ch_id=channel_id)
check_list('/tmp/db_fake_dump')
t = get_template('index.html')
html = t.render(Context({'channels': ch.objects.all().order_by('id'), 'host':request.get_host()}))
return HttpResponse(html)
Environment:
Request Method: GET
Request URL: http://10.10.13.253:8080/update/15
Django Version: 1.2.3
Python Version: 2.6.6
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'iptvmon.iptvmonitor']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py" in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
Exception Type: TypeError at /update/15
Exception Value: update_channel() takes exactly 2 arguments (1 given)
Офлайн
1.
Лучше параметры именовать
url(r'^(?P<child_id>\d+)/$', 'edit', name="child-edit"),
urlpatterns = patterns('', (r'^articles/2003/$', 'news.views.special_case_2003'), (r'^articles/(\d{4})/$', 'news.views.year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'), )
Офлайн
Спасибо. Каюсь, я не придал скобкам значения.
Офлайн
А я вот не знаю, зачем именовать параметры, только засоряет регекспы избыточной информацией.
Офлайн
In practice, this means your URLconfs are slightly more explicit and less prone to argument-order bugs – and you can reorder the arguments in your views' function definitions. Of course, these benefits come at the cost of brevity; some developers find the named-group syntax ugly and too verbose.
Офлайн
Это скорее фигура речи была :)) Я знаю, зачем параметры именовать. Первый год использования джанги я так и делал, а потом понял, что толку от них мало, короче стал одним из “developers find the named-group syntax ugly and too verbose”
Офлайн
lorien, я в этом и не сомневался :)
Мне наоборот кажется, что при нормальных RESTful (ненавижуэтослово) urls читаемость улучшается.
Офлайн
lorienНапример так
А я вот не знаю, зачем именовать параметры, только засоряет регекспы избыточной информацией.
class CommonBaseView(object): PARAMS={} def dispatch(self, request, *args, **kw): def _get(attr, model): if kw.get('%s_id' % attr): try: val=model.objects.get(pk=kw['%s_id' % attr]) except model.DoesNotExist: raise PermissionDenied else: val="" setattr(self, attr, val) for param, model in self.PARAMS.items(): get(param, model) return super(CommonBaseView, self).dispatch(request, *args, **kw) def get_context_data(self, **kwargs): context=super(CommonBaseView, self).get_context_data(**kwargs) for param in self.PARAMS.keys(): context[param]=getattr(self, param) return context
class ProjectBaseView(CommonBaseView): PARAMS={ 'person':Person, 'adress':Adress, 'child':Child, 'organization':Organization, 'anket':Anket }
url(r'^detail_all/(?P<person_id>\d+)/$', PersonDetail.as_view(template_name = "person/all.html"), name='person_all' ), url(r'^detail_home/(?P<person_id>\d+)/(?P<adress_id>\d+)/$', PersonDetail.as_view(template_name = "person/home.html"), name='person_home' ), url(r'^detail_child/(?P<person_id>\d+)/(?P<child_id>\d+)/$', PersonDetail.as_view(template_name = "person/childe.html"), name='person_child' ),
@my_login_required class PersonDetail(ProjectBaseView, TemplateView): pass
Отредактировано FishHook (Июнь 25, 2012 06:48:43)
Офлайн