Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2012 13:31:56

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамический URL

Здравствуйте. В документации есть ответ на мой вопрос, но оно не работает. Нужно во вьюху передать 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)



Офлайн

#2 Июнь 22, 2012 13:38:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Динамический URL

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'),
)



Офлайн

#3 Июнь 22, 2012 13:50:25

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамический URL

Спасибо. Каюсь, я не придал скобкам значения.



Офлайн

#4 Июнь 23, 2012 13:17:34

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Динамический URL

А я вот не знаю, зачем именовать параметры, только засоряет регекспы избыточной информацией.

Офлайн

#5 Июнь 23, 2012 13:20:11

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Динамический URL

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.



Офлайн

#6 Июнь 23, 2012 13:23:57

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Динамический URL

Это скорее фигура речи была :)) Я знаю, зачем параметры именовать. Первый год использования джанги я так и делал, а потом понял, что толку от них мало, короче стал одним из “developers find the named-group syntax ugly and too verbose”

Офлайн

#7 Июнь 23, 2012 13:30:48

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Динамический URL

lorien, я в этом и не сомневался :)

Мне наоборот кажется, что при нормальных RESTful (ненавижуэтослово) urls читаемость улучшается.



Офлайн

#8 Июнь 25, 2012 06:45:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Динамический URL

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version