【问题标题】:Reverse for '' with no arguments not found when passing and retrieving parameters between views在视图之间传递和检索参数时,没有找到没有参数的“”
【发布时间】:2018-04-30 19:22:21
【问题描述】:

Django 版本:1.10 基本上,我希望已登录的用户使用自己的数据访问该页面。 因此,当用户提供登录凭据时,绕过“pk”重定向到其他页面,因此该页面将仅包含与该“pk”相关的数据。

我在 StackOverflow 中看到了其他关于 Reverse for '' 的帖子,但没有找到任何参数,但我不知道为什么这对我不起作用,非常感谢这么多见解和解决方案

在主项目的urls.py中:

urlpatterns = [
    url(r'^admin/', admin.site.urls,name='admin'),
    url(r'^basic_app/',include('basic_app.urls',namespace='basic_app')),]

我有一个名为 basic-app 的应用,其中包含 urls.py

from django.conf.urls import url
from basic_app import views

app_name = 'basic_app'

urlpatterns = [
         url(r'^login/$', views.user_login, name='user_login'),
         url(r'^class/(?P<pk>\d+)/$',views.ClassroomView,name='classroom_list'), ]

在views.py中,我有一个用户登录视图,应该发送参数为

def user_login(request):

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user:
            if user.is_active:
                login(request,user)
                # then send the user to Classroom view with 'pk' as parameter
                return redirect(reverse('basic_app:classroom_list'), {'pk': user.id})

我应该在以下 ClassroomView 中从 LoginView 获取“pk”:

def ClassroomView(request,pk):
    
        classroom_list = Classroom.objects\
                            .filter(school__user=User.objects.get(pk=request.session.get('user_id','0')))
        class_dict = {'class_records': classroom_list}
        return render(request, 'basic_app/classroom_list.html', context=class_dict)

但是,它说

Reverse for 'classroom_list' with no arguments not found. 1 pattern(s) tried: ['basic_app/class/(?P<pk>\\d+)/$']

而且,网址显示以下内容,没有“pk”

http://127.0.0.1:8000/basic_app/login/

我认为问题在于return redirect()。如果我只写以下内容: return redirect('basic_app:classroom_list', {'pk': user.id})

它给出了以下错误:

NoReverseMatch at /basic_app/login/
Reverse for 'classroom_list' with arguments '({'pk': 2},)' not found. 1 pattern(s) tried: ['basic_app/class/(?P<pk>\\d+)/$']

那么,如何通过传递参数链接到下面的 URL?

url(r'^class/(?P<pk>\d+)/$',views.ClassroomView,name='classroom_list')

【问题讨论】:

  • 你能用主项目 urls.py 和 django 版本更新你的问题吗?
  • 更重要的是实际尝试进行反向映射的代码。
  • 感谢您的快速回复!我已经更新了内容,所以请在这里告诉我我做错了什么
  • 你试过return redirect(reverse('classroom_list', kwargs={'pk': user.id})) 吗?
  • thanx @Asher 我确实尝试过使用 kwargs,但愚蠢的我之前使用了 return redirect(reverse('classroom_list'), kwargs={'pk': user.id}) 所以它抛出了错误

标签: python django redirect


【解决方案1】:

语法是:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

所以

return redirect(reverse('basic_app:classroom_list', kwargs={'pk': user.id}))

【讨论】:

  • 我们需要reverse('basic_app:classroom_list'吗?因为我们试图从同一个应用程序访问 url。那么reverse('classroom_list'够了吗?
  • 我认为当有命名空间时必须提及。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2014-04-08
  • 2021-11-30
  • 2014-07-09
  • 2021-05-25
  • 2021-02-20
  • 2015-11-16
  • 2021-09-30
相关资源
最近更新 更多