Django - динамический просмотр URL - PullRequest
2 голосов
/ 20 мая 2011

Я хочу загрузить определенное представление в зависимости от URL, например:

url(r'^channel/(?P<channel>\d+)/$', ---, name='channel_render'),

В зависимости от канала, переданного в URL, я хочу загрузить определенный файл представления.Я попытался сделать это:

def configure_view(channel):
    print channel

urlpatterns = patterns('',
    url(r'^channel/(?P<channel>\d+)/$', configure_view(channel), name='channel_render'),

Но очевидно, что аргумент канала не передается. Есть ли способ сделать это?Единственное другое решение, о котором я могу подумать, - это загрузить представление менеджера, а затем загрузить соответствующий файл представления оттуда.Если это единственный способ, как мне перенаправить файл другого представления из представления?

Ответы [ 4 ]

4 голосов
/ 20 мая 2011

Вы можете сделать что-то вроде этого.

#urls.py
url(r'^channel/(?P<channel>\d+)/$', switcher, name='channel_render'),

#views.py
def switcher(request, channel):
    if channel == 'Whatever':
        return view_for_this_channel()

def view_for_this_channel()
    #handle like a regular view

Если вы используете представления на основе классов, вызов в вашем switcher() будет выглядеть следующим образом:

#views.py
def switcher(request, channel):
    if channel == 'Whatever':
        return ViewForThisChannel.as_view()(request)  # <-- call to CBV

def ViewForThisChannel(View):
    #handle like a regular class-based view
2 голосов
/ 17 августа 2014

Для перенаправления вы должны использовать функцию ярлыка перенаправления Django:

from django.shortcuts import redirect

def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

https://docs.djangoproject.com/en/1.7/topics/http/shortcuts/#redirect

0 голосов
/ 20 мая 2011

попробуйте позвонить как обычный вид, например

def configure_view(request, channel):
    print channel

url(r'^channel/(?P<channel>\d+)/$', configure_view, name='channel_render'),
0 голосов
/ 20 мая 2011

Я думаю, что самый простой способ сделать это - загрузить представление, функционирующее как крошечный диспетчер, который вызывает конечный вид, который вас интересует.

Что касается того, как это сделать, представления - это просто функции, которые вызываются определенным образом и ожидают, что они возвращают определенную вещь. Вы можете назвать один вид из другого; просто убедитесь, что вы правильно возвращаете результат.

Вы можете загружать представления из разных файлов с помощью import.

...