Я новичок в django, как разрешить пользователям доступ к домашней странице только после входа в систему? - PullRequest
0 голосов
/ 20 февраля 2020

pmmvy urls.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')),
]

pmmvyapp urls.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'

pmmvyapp views.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'})   

user 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 ( запрос), но это не сработало, я не уверен, как кодировать это.

Любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 20 февраля 2020

В вашем шаблоне, скажем, pmmvyapp/home.html, вы можете добавить проверку, чтобы проверить, аутентифицирован ли пользователь.

{% if user.is_authenticated %}
  <html for home page>
{% else %}
  <p>You're not logged in.</p>
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...