Django个人学习笔记 – 实现登录功能并根据每个用户切换显示内容-

首先

以下是我在Django的私人学习笔记。我总结了在ChatGPT4上查找的内容和额外查找的内容,以便可以作为文章进行回顾。

步骤

本次我们将利用Django内置的认证功能来进行实现。

1. 用于用户认证的设置

1.1 安装所需的应用程序

在Django项目的settings.py文件中,添加以下应用程序。

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    ...
]

1.2 网址的设置

请在urls.py文件中添加以下URL模式。

from django.contrib.auth import views as auth_views

urlpatterns = [
    ...
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    ...
]

2. 实现LoginView。

在`views.py`文件中实现`LoginView`并设置路径。

from django.contrib.auth.views import LoginView

class AppLoginView(LoginView):
    fields = "__all__"
    #初期時はregistrationディレクトリが指定されている、自作のアプリ内に変更したい場合は以下が必要
    #template_name = "myApp/login.html"    "myApp"は各自のapp名に置き換え

    def get_success_url(self):
        return reverse_lazy("遷移先url")    #"http://127.0.0.1:8000/〇〇/"の"〇〇"部
from views import ApploginView
from django.contrib.auth.views import LogoutView

urlpatterns = [
    path("login/", AppLoginView.as_view(), name="login"),
    path("logout/", AppLoginView.as_view(next_page="login"), name="logout"),
]

然后我们将创建login.html文件。可以在template目录下的registration目录(初始时)或者自制的app目录中创建login.html。

<h2>Login</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Login</button>
</form>

请将以下内容添加到HTML中以放置注销按钮。

<a href="{% url 'logout' %}">ログアウト</a>

通过这样做,可以实现最基本的登录功能。

3. 根据是否已登录切换显示内容。

有两种方式可以在模板中切换和在视图中切换。

在模板内切换的方法

在Django中,您可以通过在模板中使用user变量来访问登录用户的信息。您可以使用以下方式{% if user.is_authenticated %}来检查用户是否已经登录。

{% if request.user.is_authenticated %}
    <p>Welcome, {{ request.user.username }}!</p>
    <!-- ログインしているユーザー向けのコンテンツ -->
{% else %}
    <p>Please log in.</p>
    <!-- ログインしていないユーザー向けのコンテンツ -->
{% endif %}

在视图中切换的方式

在视图中,也可以处理每个用户不同的信息。以下示例展示了如何根据登录的用户将数据传递给模板。

from django.shortcuts import render

def my_view(request):
    if request.user.is_authenticated:
        # ログインしているユーザー向けのデータを取得
        data = get_data_for_user(request.user)
    else:
        # ログインしていないユーザー向けのデータを設定
        data = get_default_data()

    return render(request, 'my_template.html', {'data': data})

如果未登录,想要跳转至登录页面的话。

在公式文档中提供了名为LoginRequiredMixin的功能。

在您想要适应的类的第一个参数中添加LoginRequiredMixin。

from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin

class HomePage(LoginRequiredMixin, ListView):    #ListViewは各自のViewに変更
    model = "各自の使用したいモデルを指定"
    ...

在settings.py中写下要跳转到的位置的指定。

默认情况下,/accounts/login/ 被设置为登录URL。你也可以使用命名URL模式。例如:LOGIN_URL = ‘login’。

...

LOGIN_URL = "myapp_app:login"

4. 根据登录用户切换显示内容。

覆写get_context_data函数,仅对已登录用户的数据应用筛选器。
※在本示例中,假设要应用筛选器的模型已经预先存在”user”字段。

from django.shortcuts import render

def my_view(request):
    ...
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["template内でのkey"] = context["key"].filter(user=self.request.user)    #ログインしているユーザのデータにフィルタをかける
        return context

備考:request.user和user有何不同之處?

在Django模板中,{{ user }}和{{ request.user }}的区别主要取决于传递给上下文的用户对象的指定方式。

    1. {{ user }}: 这个变量用于引用从视图向模板明确传递的用户对象。在视图函数中,如果设置了 context[‘user’] = some_user_object,那么它将被使用。

{{ request.user }}: 这个变量用于引用当前经过验证的用户,从请求对象中提取。如果使用 Django 的认证系统,登录的用户会自动保存在 request.user 中。在模板中使用这个变量可以获取与当前请求相关联的已认证用户。

基本上,使用{{ request.user }}可以自動根據認證獲取當前用戶,這在許多情況下非常方便。另一方面,{{ user }}可以在更加定制化的用例中使用,例如在特定的視圖中傳遞特殊的用戶對象。

备考②:LOGIN_URL和LOGIN_REDIRECT_URL的区别是什么?

登陆链接

这个设置用于指定未经认证的用户访问需要登录的视图时所重定向到的URL。
默认情况下,它被设置为/accounts/login/。
也可以使用命名URL模式。例如:LOGIN_URL = ‘login’
当未认证用户访问带有登录保护的视图(如@login_required装饰器或LoginRequiredMixin)时,用户将被重定向到这个URL。

登录重定向网址

这个设置确定用户登录后要重定向的URL。
默认情况下,它设置为/accounts/profile/。
也可以使用具名URL模式。例如:LOGIN_REDIRECT_URL = ‘dashboard’。
例如,当用户成功提交登录表单后,将重定向到这个设置指定的URL。

总结

通过使用内置的身份验证功能,可以轻松地实现登录功能。

bannerAds