【问题标题】:pass argument to view with reverse django使用反向 django 将参数传递给视图
【发布时间】:2017-07-07 18:48:23
【问题描述】:

我有一个视图create_rating,在我提交表单后,我希望它在视图rating_upload 上进行处理,然后我想重定向回create_rating 视图。似乎无法让它工作,下面是我的最新代码。我想当我在create-rating 页面上单击submit 时,它应该将video_id 发送到rating_upload,然后我可以从那里将它作为参数发送回create_rating。文档也显示了这一点。我尝试了几件事,最新的错误就是我所显示的..

网址:

urlpatterns = [
    url(r'^upload', UploadVideo.as_view(), name='upload'),
    url(r'^(?P<pk>[0-9]+)/$', VideoView.as_view(), name='videoview'),
    url(r'^(?P<video_id>\d+)/create_rating', create_rating, name='create_rating'),
    url(r'^(?P<video_id>\d+)/rating_upload', rating_upload, name='rating_upload'),
    url(r'^(?P<video_id>\d+)/rating_uploaded', rating_upload, name='rating_upload')
]

浏览量:

def create_rating(request, video_id):
    vid = get_object_or_404(Video, pk=video_id)
    past_ratings = vid.rating.order_by('date_created')[:5]
    template = loader.get_template('create_rating.html')
    context = {
        'vid': vid, 'past_ratings': past_ratings
    }
    return HttpResponse(template.render(context, request))


def rating_upload(request, video_id):
    template = loader.get_template('rating_upload.html')
    rated_video = Video.objects.get(pk=video_id)
    context = {
        'rated_video': rated_video
    }
    return HttpResponseRedirect(reverse('create_rating', video_id))

模板,create_rating.html

<p>{{ vid.title }}</p>

<form action="{% url 'rating_upload' vid.pk %}"  method="post">

{% csrf_token %}
<input type="text" name="rate_comment">
<input type="submit" value="Rate Video">

最新错误:

Request Method: POST
Request URL: http://127.0.0.1:8000/video/32/rating_uploaded

Django Version: 1.10.5
Python Version: 2.7.10
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'video']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/RyanHelling/virtualenvs/env1/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/Users/RyanHelling/virtualenvs/env1/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/Users/RyanHelling/virtualenvs/env1/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/RyanHelling/PycharmProjects/flash2/video/views.py" in rating_upload
  63.     return HttpResponseRedirect(reverse('create_rating', video_id))

Exception Type: TypeError at /video/32/rating_uploaded
Exception Value: an integer is required

【问题讨论】:

  • TypeError at /video/32/rating_uploaded an integer is required 错误反馈似乎是获取单词 video 并尝试将其映射到不应该的 id。我在您的路线中没有看到 /video/ 任何地方,所以我不确定它是从哪里得到的?您是否在任何地方命名或导入网址?
  • 嗨,是的,我正在将 url 导入到高于 video 的级别

标签: django redirect httpresponse reverse


【解决方案1】:

试试

return HttpResponseRedirect(reverse('create_rating', args=(video_id,)))

而不是

return HttpResponseRedirect(reverse('create_rating', video_id))

Documentation 建议将您的 args 作为元组传递。

【讨论】:

  • 我试过了,它告诉我reverse() takes no keyword arguments
  • @ratrace123,你从哪里导入反向?对于您的错误,我只发现了this 问题,这是关于错误的导入。根据文档,reverse 最多需要五个参数:reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)。
  • 啊,我认为这是我的问题的一部分,我让它从音频循环或类似的东西导入...我将其更改为从 django.urls 导入
  • 好的,我想我明白了,我更改了导入并添加了kwargs: return HttpResponseRedirect(reverse('create_rating', kwargs={'video_id':video_id})) 谢谢!
  • args=(video_id) 在 args=(video_id,) 末尾需要一个逗号以使其成为有效的元组
猜你喜欢
  • 1970-01-01
  • 2017-12-13
  • 2012-01-17
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多