Найти - Пользователи
Полная версия: Динамический URL
Начало » Django » Динамический URL
1
UsCr
Здравствуйте. В документации есть ответ на мой вопрос, но оно не работает. Нужно во вьюху передать id записи в таблице через URL такого вида: /update/15 (15 - это и есть ИД). Делаю как описано в документации. Но… Не работает. В urls.py написано так:

('^update/\d+$', update_channel),

В views.py так:

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)

При переходе по url получаю ошибку:

Exception Value:
update_channel() takes exactly 2 arguments (1 given)

Вот вывод “copy-and-paste view” ошибки:

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)
FishHook
1.
Лучше параметры именовать
 url(r'^(?P<child_id>\d+)/$', 'edit', name="child-edit"),
2.
Плохо ты смотрел в документацию, если не увидел там скобок
Пример из Dgango-book
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'),
)
UsCr
Спасибо. Каюсь, я не придал скобкам значения.
lorien
А я вот не знаю, зачем именовать параметры, только засоряет регекспы избыточной информацией.
fata1ex
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.
lorien
Это скорее фигура речи была :)) Я знаю, зачем параметры именовать. Первый год использования джанги я так и делал, а потом понял, что толку от них мало, короче стал одним из “developers find the named-group syntax ugly and too verbose”
fata1ex
lorien, я в этом и не сомневался :)

Мне наоборот кажется, что при нормальных RESTful (ненавижуэтослово) urls читаемость улучшается.
FishHook
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

Идея спорная, но лично мне так работать удобнее.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB