Man*_*tha 2 python django redirect
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')),]
Run Code Online (Sandbox Code Playgroud)
我有一个名为 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'), ]
Run Code Online (Sandbox Code Playgroud)
在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})
Run Code Online (Sandbox Code Playgroud)
我应该在以下 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)
Run Code Online (Sandbox Code Playgroud)
但是,它说
Reverse for 'classroom_list' with no arguments not found. 1 pattern(s) tried: ['basic_app/class/(?P<pk>\\d+)/$']
Run Code Online (Sandbox Code Playgroud)
并且,该 url 显示以下内容,没有 '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+)/$']
Run Code Online (Sandbox Code Playgroud)
那么,我如何通过传递参数链接到下面的 url?
url(r'^class/(?P<pk>\d+)/$',views.ClassroomView,name='classroom_list')
Run Code Online (Sandbox Code Playgroud)
语法是:
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Run Code Online (Sandbox Code Playgroud)
所以
return redirect(reverse('basic_app:classroom_list', kwargs={'pk': user.id}))
Run Code Online (Sandbox Code Playgroud)