我是django的新手,如何允许用户登录后才能访问主页



pmmvyurls.py(我从这里重定向到pmmvapp.urls(

from django.contrib import admin
from django.urls import path,include
from users import views as user_views
from django.contrib.auth import views as auth_views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('register/', user_views.register, name='register'),
path('profile/', user_views.profile, name='profile'),
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),     
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name='password_reset'),
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name='password_reset_done'),
path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name='password_reset_confirm'),
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name='password_reset_complete'),
path('', include('pmmvyapp.urls')),
]

pmmvyappurls.py(我试着用一些东西重定向到登录页面作为主页,但不能(

from django.urls import path
from .views import ( PostListView,PostDetailView,PostCreateView,HomeView
PostUpdateView,PostDeleteView,UserPostListView)
from . import views
urlpatterns = [
path('', views.HomeView.as_view(), name='pmmvyapp-home'),
path('user/<str:username>', UserPostListView.as_view(), name='user-posts'),
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
path('post/new/', PostCreateView.as_view(), name='post-create'),
path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
path('about/', views.about, name='pmmvyapp-about'),
]

settings.py(我已经安装了所有的应用程序,并给出了登录重定向(

INSTALLED_APPS = [
'users.apps.UsersConfig',
'pmmvyapp.apps.PmmvyappConfig',
'crispy_forms',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
CRISPY_TEMPLATE_PACK='bootstrap4'
LOGIN_REDIRECT_URL='pmmvyapp-home'
LOGIN_URL='login'

pmmvyappviews.py

from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.shortcuts import render, get_object_or_404
from django.contrib.auth.models import User
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.http import HttpResponse
from .models import Post

def home(request):
context={
'posts':Post.objects.all()
}
return render(request, 'pmmvyapp/home.html', context)

class PostListView(ListView):
model = Post
template_name = 'pmmvyapp/home.html'
context_object_name = 'posts'
ordering = ['-date_posted']
paginate_by = 5

class UserPostListView(ListView):
model = Post
template_name = 'pmmvyapp/user_posts.html'
context_object_name = 'posts'
paginate_by = 5
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')

class PostDetailView(DetailView):
model = Post

class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'content'] 
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
fields = ['title', 'content'] 
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False    

class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Post
success_url = '/'
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
def about(request):
return render(request, 'pmmvyapp/about.html', {'title':'About'})   

用户views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm

# Create your views here.
def register(request):
if request.method == 'POST':
form=UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Your account has been created!You are now able to log in')
return redirect('login')
else:
form=UserRegisterForm()   
return render(request,'users/register.html',{'form': form})

@login_required
def profile(request):
if request.method == 'POST':
u_form = UserUpdateForm(request.POST,instance=request.user)
p_form = ProfileUpdateForm(request.POST,request.FILES,instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f'Your account has been updated')
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)   
context = {
'u_form': u_form,
'p_form': p_form
}
return render(request,'users/profile.html',context)

我只想允许用户只有在登录后才能访问主页。我觉得我应该在pmmvyapp的视图中做一些更改。在那里,我尝试了def home所需的登录(请求(,但它不起作用,我不知道如何在中编码。

如有任何帮助,我们将不胜感激。

感谢

在您的模板中,比如pmmvyapp/home.html,您可以添加一个检查来查看用户是否已通过身份验证。

{% if user.is_authenticated %}
<html for home page>
{% else %}
<p>You're not logged in.</p>
{% endif %}

最新更新