Issue
Django version: 1.10 Basically, I want users who have logged in to go to the page with their own data. So, when the user provides login credentials, redirect to some other page bypassing 'pk' so the page will have only data related to that 'pk'.
I have seen other posts in StackOverflow about Reverse for '' with no arguments not found but I don't know why this is not working for me so many insights and solutions are highly appreciated
In urls.py of the main project:
urlpatterns = [
url(r'^admin/', admin.site.urls,name='admin'),
url(r'^basic_app/',include('basic_app.urls',namespace='basic_app')),]
And I have an app named basic-app which contains urls.py as
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'), ]
In views.py, I have a user login view that should send parameters as
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})
I should get 'pk' from LoginView in the following ClassroomView:
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)
But, it says
Reverse for 'classroom_list' with no arguments not found. 1 pattern(s) tried: ['basic_app/class/(?P<pk>\\d+)/$']
And, the url shows the following without 'pk'
http://127.0.0.1:8000/basic_app/login/
The problem, I think lies in return redirect(). If I just write the following:
return redirect('basic_app:classroom_list', {'pk': user.id})
It gives the following error:
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+)/$']
So, how can I link to the URL below by passing the argument?
url(r'^class/(?P<pk>\d+)/$',views.ClassroomView,name='classroom_list')
Solution
syntax is:
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
so
return redirect(reverse('basic_app:classroom_list', kwargs={'pk': user.id}))
Answered By - Sandeep Balagopal
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.