【问题标题】:How to link to user's profile on django如何链接到 django 上的用户个人资料
【发布时间】:2020-09-17 15:15:11
【问题描述】:

我一直在尝试链接到用户的个人资料页面,但每次尝试时,它都会返回 404 错误。我不知道,但错误可能在 urls.py 文件中。

views.py

    def profile(request, username=None):
      if username:
        post_owner = get_object_or_404(User, username=username)

      else:
        post_owner = request.user

      args1 = {
        'post_owner': post_owner,
      }
      return render(request, 'profile.html', args1)

urls.py

    urlpatterns = [
      path('<str:username>/', views.profile, name='profile'),
      path('login', views.login, name='login'),
      path('register', views.register, name='register'),
      path('logout', views.logout, name='logout'),

    ]

index.html

    <a class="nav-link" href="{{ request.user }}">{{ user.username }}</a>

【问题讨论】:

    标签: python html django django-views django-templates


    【解决方案1】:

    “@Willem Van Onsem”给出了完全正确的答案。但我想补充的一件事是防止重叠。您可以重新排列规则并将该规则放在所有规则的底部。因为 django 从上到下检查规则,并在找到第一个匹配时停止匹配。

    urlpatterns = [
            path('login/', views.login, name='login'),
            path('register/', views.register, name='register'),
            path('logout/', views.logout, name='logout'),
    
            path('<str:username>/', views.profile, name='profile'),
     ]
    

    一切都会正常的。

    【讨论】:

    • 我认为您应该在这里警告用户不能将loginlogoutregister 作为用户名。这实际上是我不建议这样做的原因之一。
    • 我也认为path('&lt;str:username&gt;/', ...是一个完全合法的模式,但它必须是最后一个。
    【解决方案2】:

    你应该把它链接到:

    &lt;a class="nav-link" href="{{ <b>request.user.username</b> }}"&gt;{{ user.username }}&lt;/a&gt;

    但最好使用{% url … } template tag [Django-doc]:

    &lt;a class="nav-link" href="<b>{% url 'profile' username=request.user.username %}</b>"&gt;{{ user.username }}&lt;/a&gt;

    您的路径也重叠,这意味着您将永远能够访问 loginregisterlogout,因为第一条路径将“触发”@ 987654328@.

    您最好定义 非重叠 路径,例如:

    urlpatterns = [
        path('profile/<str:username>/', views.profile, name='profile'),
        path('login/', views.login, name='login'),
        path('register/', views.register, name='register'),
        path('logout/', views.logout, name='logout'),
    ]

    【讨论】:

    • 嗨,Williem,谢谢你,有没有什么办法可以链接到我的个人资料页面,而网址上没有 profile/
    • @JuanMartinZabala:你不需要在前面加上profile/ 你只需要使路径不重叠。您可以通过所有可能的方式执行此操作,例如为login/logout/ 等添加前缀,因为str: 无论如何都不允许使用斜杠。但是现在没有人可以在您的网站上登录/注销/注册:)
    • 好的,所以我有一个 index.html,它有一个导航栏,它连接到一个 css,我可以做些什么来将模板扩展到其他 html 而不使用相同的 css 链接?我需要把所有东西都组织好,所以我想每个 html 都有一个 css
    • @JuanMartinZabala:您可以将参数传递给模板。但是每个 html 文件都有一个单独的 css 文件看起来很奇怪,css文件的想法是“重用”它,否则您可以在&lt;style&gt;标志中定义样式。跨度>
    • urlpatterns 可以,但path('&lt;str:username&gt;/' ... 必须是最后一个。 Facebook 和我的网站 Speedy Net 上的网址也使用类似的路径。
    猜你喜欢
    • 2014-10-09
    • 2020-08-09
    • 2012-01-20
    • 2012-09-06
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多