Могу ли я передать ключевое слово представления без определения URL в функцию представления при перенаправлении? - PullRequest
0 голосов
/ 25 января 2012
NoReverseMatch at /natrium/script/4c55be7f74312bfd435e4f672e83f44374a046a6aa08729aad6b0b1ab84a8274/

Reverse for 'run_details' with arguments '()' and keyword arguments '{'script_text': u'print "happy"', 'run_id': '6b2f9127071968c099673254fb3efbaf'}' not found.

Это выдержка из моих views.py

run_id = new_run.run_id
if not run_id:
raise AssertionError("bad run id")

# I tried with args=[run_id, clean['script_text']] too
return HttpResponseRedirect(reverse('run_details', kwargs={'run_id':run_id, 'script_text':clean['script_text']})) 

который по очереди вызывает эту функцию просмотра

def run_details(request, run_id, script_text):
    """
    Displays the details of a given run.
    """
    run = Run(run_id)
    run.update(request.user)

    codebundle = CodeBundle(run.cbid)
    codebundle.update(request.user)

    return render_response(request, "graphyte/runs/run_script.html",
                           {'run':run, 'codebundle':codebundle, 'files':run.artifacts, 'bundle':codebundle,
                            'source_code': script_text
                           })

Теперь это мой urls.py. Фактические представления перенаправления находятся в другом приложении (вроде безумно, но что угодно ...).

urlpatterns = patterns("webclient.apps.codebundles.views",
    # many.....
    url(r"^cb/newfolder/$", 'codebundle_newfolder', name="codebundle_newfolder"),
)

urlpatterns += patterns('webclient.apps.runs.views',
        url(r"^run_details/(?P<run_id>\w+)/$", 'run_details', name="run_details"),)

Это становится очень неприятно за последние три часа. Я не уверен, что происходит. Может кто-нибудь помочь мне отладить это?

Спасибо.


В первоначальном плане не было script_text, и я использовал только args = ['run_id']. Оно работает. Другими словами, удалите script_text из двух представлений, все будет работать.


EDIT Извините за путаницу. Текст скрипта - это просто переменная контекста, которую мне нужно передать в обратный пункт назначения, и оттуда я отображаю свой шаблон. URL должны отображать только run_id.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Нет, вы не можете передать «дополнительное ключевое слово» в функцию просмотра при перенаправлении. Я постараюсь объяснить, почему.

Когда вы возвращаете HttpResponseRedirect, Django возвращает ответ с кодом состояния 302 и новым местоположением.

HTTP/1.1 302 Found
Location: http://www.example.com/new-url/

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

  1. Включить в URL дополнительное ключевое слово:

    http://www.example.com/new-url/keyword-value/

  2. Включить дополнительное ключевое слово в качестве параметра GET

    http://www.example.com/new-url/?keyword=keyword-value.

    Затем, по вашему мнению, возьмите ключевое слово с помощью keyword=request.GET['keyword']. Обратите внимание, что ключевое слово больше не является kwarg в сигнатуре представления.

Третий подход - вставить ключевое слово в сеанс перед перенаправлением, а затем извлечь его в сеансе в перенаправленном представлении. Я бы не советовал этого делать, потому что это состояние и может привести к странным результатам, когда пользователи обновляют страницы и т. Д.

1 голос
/ 25 января 2012

Ваш run_details URL вообще не принимает kwarg с именем script_text - удалите его из своих обратных kwargs.

...