Перенаправление на страницу входа по любой ссылке, по которой я нажимаю - PullRequest
0 голосов
/ 08 февраля 2019

По какой бы ссылке я ни щелкал. Меня перенаправляют только на страницу входа.

Я пытался изменить порядок urls.py и перенаправить URL-адреса, но я хочу, чтобы регистрация перенаправляла на страницу регистрации, а логин должен перенаправлятьэто на страницу входа. но когда я нажимаю на любую ссылку, она перенаправляет только на страницу входа.

urls.py
------

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from app import views
from django.contrib.auth import views as auth_views
from django.contrib.auth.views import LoginView
from django.contrib.auth.views import LogoutView
from django.views.generic.base import TemplateView
from django.conf.urls import url, include

app_name = "App"

urlpatterns = [
    url(r'^index/', views.index,name='index'),
    url(r'^signup/', views.signup,name='signup'),
    url(r'^Login/', views.Login,name='Login'),
    url(r'^Logout/', views.Logout,name='Logout'),
    url('admin/', admin.site.urls),
    url('App/', include('django.contrib.auth.urls')),
    url('', TemplateView.as_view(template_name='home.html'), name='home'),
]

models.py:
---------
from django.db import models
from django.template.defaultfilters import slugify
from django.contrib.auth.models import User

class Event(models.Model):
     fname = models.CharField('fname', max_length=120)
     lname = models.CharField('lname',max_length=120)
     username = models.CharField('username',max_length = 60,unique=True)
     password = models.CharField('password',max_length=120,default='pavi@2789')

     def __unicode__(self):
          return self.fname

     class Meta:
          # managed = False
          db_table = "user"

view.py:
---------
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, logout,login
from django.http import HttpResponse, HttpResponseRedirect
from django import forms
from .forms import UserRegistrationForm
from .models import Event
from django.contrib.auth import get_user_model
from django.utils.datastructures import MultiValueDictKeyError
from .context_processors import include_login_form
from django.contrib.auth.decorators import login_required
from .forms import login_form
from django.contrib.auth.views import LoginView
from django.contrib.auth.views import LogoutView
from django.contrib.auth.forms import AuthenticationForm
from django.core.exceptions import ValidationError



# Create your views here.
# @login_required(login_url="Login/")

def index(request):
    return render(request, 'index.html')

def signup(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            userObj = form.cleaned_data
            username = userObj['username']
            password = userObj['password']
            fname = userObj['fname']
            lname = userObj['lname']
            print (username,password,fname,lname)
            if(len(password)<8):
                raise ValidationError("This password length should be minimum 8 characters ")
            if not (User.objects.filter(username=username).exists()):
                p = Event(fname=fname, lname=lname, username=username, password=password)
                p.save()
                #return HttpResponseRedirect('Login.html')
                return redirect('/Login/')
            else:
                raise forms.ValidationError('Looks like a username with that username or password already exists')
    else:
        form = UserRegistrationForm()
    return render(request, 'signup.html', {'form' : form})


def home(request):
    return render(request, 'home.html')


def Login(request):
    form = login_form(request.POST or None)
    if form.is_valid():
        username = form.cleaned_data.get("username")
        password = form.cleaned_data.get("password1")
        print (username,password)
        user = authenticate(username=username, password=password)
        print('user is', user)
        if user is not None and user.is_active:
            print ('entered loop')
            login(request,user)
            return redirect('/home/')
        else:
            print ("username and password are incorrect ")
    else:
        form = login_form()
    return render(request, 'Login.html', {'form': form})

def Logout(request):
    logout(request)

settings.py:
-----------

LOGIN_REDIRECT_URL = 'home'
LOGOUT_REDIRECT_URL = 'home'
#
LOGIN_URL = 'Login'
LOGOUT_URL = 'Logout'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'OPTIONS': {
            'options': '-c search_path=App'
        },
        'NAME': 'DBName',
        'USER': 'postgres',
        'PASSWORD': 'XXXXXXX',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}


AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",
)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, r'App\templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


forms.py:
--------
from django import forms
from django.contrib.auth.models import User
from .models import Event
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import authenticate, logout,login
from django.shortcuts import render, redirect


class UserRegistrationForm(forms.Form):
    fname = forms.CharField(required=True,label='FirstName',max_length=32)

    lname = forms.CharField(required=True,label='LastName',max_length=32)

    username = forms.CharField(required = True,label = 'Username',max_length = 32)

    password = forms.CharField(required = True,label = 'Password',max_length = 32)


class login_form(forms.Form):
    username = forms.CharField()
    password1 = forms.CharField(widget=forms.PasswordInput)


index.html;
----------
<!-- App/templates/index.html -->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>MYProject!</title>
    </head>
    <body>
        <h1>My Project!</h1>
    <a href="/"><br>Signup</br> </a>
    <a href="/">Login</a>
    </body>
</html>

регистрация должна перенаправлять на страницу регистрации, а вход должен перенаправлять на страницу входа.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Помимо ответа Даниэля Роземана (я думаю, что он решает актуальную проблему вопроса), я думаю, что ваша проблема с регулярным выражением urlpattern.Пожалуйста, обновите их так:

urlpatterns = [
    url(r'^index/$', views.index,name='index'),  # using $ to strict match pattern
    url(r'^signup/$', views.signup,name='signup'),
    url(r'^login/$', views.Login,name='login'),
    url(r'^logout/$', views.Logout,name='logout'),
    url(r'^admin/', admin.site.urls),
    url(r'^app/', include('django.contrib.auth.urls')),
    url(r'^.*$', TemplateView.as_view(template_name='home.html'), name='home'),  # pattern for accepting any pattern

]
0 голосов
/ 08 февраля 2019

Я не могу понять, как вы ожидаете, что это будет работать:

<a href="/"><br>Signup</br> </a>
<a href="/">Login</a>

У вас есть две ссылки, и вы жестко закодировали назначение обеих ссылок как "/", то естьстраница указателя.Если вы хотите, чтобы они переходили на настоящие страницы, вам нужно вставить фактические ссылки. Вы можете использовать тег {% url %}, чтобы избежать жесткого кодирования путей.

<a href="{% url "signup" %}"><br>Signup</br> </a>
<a href="{% url "Login" %}">Login</a>
...