网址在 Django 中不起作用

Posted

技术标签:

【中文标题】网址在 Django 中不起作用【英文标题】:Url not woking in django 【发布时间】:2020-01-22 14:16:18 【问题描述】:

我的问题有两个,都围绕 NoReverseMatch 错误。 第一个问题:每次在使用不同视图的其他页面中调用我的 url(% url 'dashboard' client.pk %) 时,我都会收到 NoReverseMatch 错误(例如DashboardPilot请检查网址)但是当我在dashboard.html中使用它时,它工作正常。

Views.py

​​>
class Dashboard(LoginRequiredMixin, UserPassesTestMixin, DetailView):
    model = ClientProfile
    template_name ='accounts/dashboard.html'
    context_object_name= 'client'
    login_url= 'login'
    fields = '__all__'
    def test_func(self):
            return self.request.user.role == 'client'

urls.py

urlpatterns =[
    path('accounts/dashboard/client/<int:pk>', Dashboard.as_view(), name='dashboard'),
    path('accounts/dashboard/pilot/<int:pk>', DashboardPilot.as_view(), name='pilot_dashboard'),
    path('jobs', JobPage.as_view(), name='job_page'),
    path('job/<int:pk>/details', JobDetails.as_view(), name='job_details'),
    path('accounts/edit/job/<int:pk>', EditJob.as_view(), name='job_edit'),
]

**models.py**

 class ClientProfile(models.Model):
   username = models.ForeignKey(User, on_delete= models.CASCADE)
   client_firstname=models.CharField(max_length=200)
   client_lastname=models.CharField(max_length =150)
   role =models.CharField(max_length =150)
   client_phone_no=models.CharField(max_length =150)
   client_email=models.EmailField(max_length=150)

第二个问题: 我有一个视图在签名后重定向到仪表板(使用 pk),但每次尝试重定向到仪表板时我都会收到反向错误。

views.py

def signin (request):
  if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']

    user = auth.authenticate(username=username, password=password)

    if user is not None:
        auth.login(request,user)
        messages.success(request, 'You are now logged in')
        if user.role == 'client':
            return redirect ('dashboard')
        else:
            return redirect ('pilot_dashboard')
    else:
        messages.error(request, 'Invalid Credentials')
        return redirect ('login')

  else:
    return render (request, 'accounts/signin.html')

urls.py

 urlpatterns =[
    path('accounts/dashboard/client/<int:pk>', Dashboard.as_view(), name='dashboard'),
    path('accounts/dashboard/pilot/<int:pk>', DashboardPilot.as_view(), name='pilot_dashboard'),
    path('jobs', JobPage.as_view(), name='job_page'),
    path('job/<int:pk>/details', JobDetails.as_view(), name='job_details'),
    path('accounts/edit/job/<int:pk>', EditJob.as_view(), name='job_edit'),
]

我尝试过使用 return redirect(reverse('dashboard', args=[str(self.id)])),但我一直没有定义自我。 我将非常感谢您提供的任何帮助

【问题讨论】:

【参考方案1】:

对于第一个问题,请确保client 对象存在于模板中。很可能,您的模板上下文没有 client 对象,这就是未解析 url 的原因。您可以通过在给您错误的模板中包含 client 来对此进行测试。 基本上你需要在url模板标签内传递正确的对象。

如果您的视图在模板上下文中没有ClientProfile,您可以在上下文中添加client 对象。

对于第二个问题,使用kwargs 关键字调用reverse。此外,您没有传递正确的值来解析 url。

用途:

return redirect(reverse('dashboard', kwargs="pk": user.clientprofile.id))

【讨论】:

感谢@Aman Garg 的回复。我尝试指定客户端对象,但在更新视图和创建视图页面中仍然出现相同的错误。我也尝试使用 ** return redirect(reverse('dashboard', kwargs="pk": user.clientprofile.id)) ** 但我仍然遇到反向错误。 你能通过在 url 中硬编码一个 pk 来检查吗?那行得通吗?尝试现有的pk。 redirect(reverse('dashboard', kwargs=1))

以上是关于网址在 Django 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

% url % 在 Django 中不起作用

视频的 RTSP 网址在 VideoView 中不起作用

为啥可选择的项目列表在 Django 中不起作用?

注销页面在 Django 中不起作用

干净的网址在 Drupal 7 中不起作用 [关闭]

为啥“发布”方法在我的 django 应用程序中不起作用?