要获取无效的凭证,甚至凭证都以Django登录格式在数据库中注册?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了要获取无效的凭证,甚至凭证都以Django登录格式在数据库中注册?相关的知识,希望对你有一定的参考价值。

我正在进行注册,登录和仪表板注册,注册表格已成功注册,用户现在存储在自定义用户模型中。注册后,该页面将转到立即登录按钮,如果用户单击它将重定向到登录页面中的登录页面我有一个用户名和密码字段,它应该与注册用户进行身份验证,并且凭据是否有效,仪表板页面应该出现,但是在我登录页面并尝试使用已注册的凭据登录时,出现了注册后的问题收到消息作为无效凭据。

My views.py
from django.shortcuts import render, redirect
from django.contrib import messages, auth
from django.contrib.auth.models import User
from contacts.models import Contact
from django.shortcuts import render,HttpResponseRedirect
from django.contrib import messages,auth
from account.forms import UserForm
from account.forms import UserRequirementForm
from django.contrib.auth import authenticate, login


def register(request):
  return render(request, 'account/register.html',);
def user_register(request):
    if request.method == 'POST': # if there is a post request in the form
        user_form = UserForm(data=request.POST) #first of all it is a user_form will be posted details present in the user_form
        user_requirement_form = UserRequirementForm(data=request.POST)# after posting the details of the user_form post the details
        if user_form.is_valid() and user_requirement_form.is_valid():
         # if user_form & user_requirement form is valid
         User = user_form.save()#if form is valid save
         user_requirement = user_requirement_form.save(commit=False)
         # Set user
         user_requirement.user = User
         user_requirement.save()
         user_requirement_form.save_m2m()
         messages.success(request,('Project saved successfully'))
         return render(request,'account/home1.html')
        else:
          messages.warning(request, 'Please correct the errors above')
    else:  
        user_form = UserForm()
        user_requirement_form = UserRequirementForm()
    return render(request,'account/register.html', {'user_form': user_form, 'requirements_form': user_requirement_form})

def login(request):
  if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    user = auth.authenticate(username=username, password=password)
    if user is not None:
      if user.is_active:
        login(request, user)
        messages.success(request, 'You are now logged in')
        return redirect('dashboard')
    else:
      messages.error(request, 'Invalid credentials')
      return redirect('login')
  else:
    return render(request, 'account/login.html')

def dashboard(request):
    return render(request, 'account/dashboard.html',);

URLS.py:

from django.conf.urls import url
from django.urls import path


from . import views
from django.conf import settings


urlpatterns = [
    path('register/', views.register,name='register'),
    path('user_register/', views.user_register, name='user_register'),
    path('login/', views.login,name='login'),
    path('dashboard/', views.dashboard,name='dashboard'),
]

login.html:

<form action="{% url 'login' %}" method="POST">
          {% csrf_token %}
          <div class="form-group">
            <label for="username">Username</label>
            <input type="text" name="username" class="form-control" required>
          </div>
          <div class="form-group">
            <label for="password2">Password</label>
            <input type="password" name="password" class="form-control" required>
          </div>
          <input type="submit" value="Login" class="btn btn-secondary btn-block">
        </form>

Forms.py:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('username','email','password')

    def clean_email(self):
        # Get the email
        email = self.cleaned_data.get('email')
        # Check to see if any users already exist with this email as a username.
        try:
            match = User.objects.get(email=email)
        except User.DoesNotExist:
            # Unable to find a user, this is fine
            return email
            raise forms.ValidationError('This email address is already in use.')
class UserRequirementForm(forms.ModelForm):
    class Meta:
        model = User_Requirement
        fields=('room','goal','design','furniture')
        error_messages = {
            'room': {
                'required': "Please select any of the room in the first step",
            },
            'goal': {
                'required': "Please select any of the goals in the second step",
            },
            'design': {
                'required': "Please select any of the design in the forth step",
            },
            'furniture': {
                'required': "Please select any of the furniture in the third step",
            },
        }
答案

您需要调用user.set_password()方法以散列格式保存密码。

def user_register(request):
    if request.method == 'POST': # if there is a post request in the form
        user_form = UserForm(data=request.POST) #first of all it is a user_form will be posted details present in the user_form
        user_requirement_form = UserRequirementForm(data=request.POST)# after posting the details of the user_form post the details
        if user_form.is_valid() and user_requirement_form.is_valid():
         # if user_form & user_requirement form is valid
         User = user_form.save()#if form is valid save

         # Add these 2 lines.
         User.set_password(request.POST['password'])
         User.save()

         user_requirement = user_requirement_form.save(commit=False)
         # Set user
         user_requirement.user = User
         user_requirement.save()
         user_requirement_form.save_m2m()
         messages.success(request,('Project saved successfully'))
         return render(request,'account/home1.html')
        else:
          messages.warning(request, 'Please correct the errors above')
    else:  
        user_form = UserForm()
        user_requirement_form = UserRequirementForm()
    return render(request,'account/register.html', {'user_form': user_form, 'requirements_form': user_requirement_form})
另一答案

这里是更有效的实现方式,而不是编写自定义登录方法。只需在您的urls.py和login.html中进行更改

urls.py

from django.contrib.auth import views as auth_views

urlpatterns = [ 
path('register/', views.register,name='register'),
path('user_register/', views.user_register, name='user_register'),
path('login/',auth_views.LoginView.as_view(template_name='account/login.html'),name="login"),
path('dashboard/', views.dashboard,name='dashboard'),
]

login.html

 <form style="max-width: 250px; margin: auto;" method='POST'>
   {% csrf_token %}
   <fieldset>
      **{{form}}**
    <div class="form-group">
      <button type="submit" class="btn btn-primary" >Login</button>
    </div>

   </fieldset>
</form>

您无需在views.py中编写任何身份验证和凭据验证步骤。 django.contrib.auth.LoginView将处理所有无效的凭证等。它减少了将表单数据映射到模型表单并编写更多步骤的工作。上面的loginview将重定向到空白url('/')。请在views.py

中添加以下行
def home(request):
    if request.user.is_authenticated:
        return redirect('dashboard')
    return render(request,'account/home.html',{})

向存在项目的settings.pyurls.py添加URL路径。

/ urls.py

from account import views as views # add app/dir name in place of account where your views.py present
urlpatterns = [
path('',views.home,name="home"),
]

添加home.html

<a href="{%url 'login'%}">Login here</a>

说明

登录成功后,您将被重定向到views.py中的def home home url。您将在检查用户是否通过身份验证。如果通过身份验证,您将重定向到仪表板

if request.user.is_authenticated:
        return redirect('dashboard')

否则,如果您尝试未经身份验证访问主页,那么您将获得带有登录链接。]的主页。

以上是关于要获取无效的凭证,甚至凭证都以Django登录格式在数据库中注册?的主要内容,如果未能解决你的问题,请参考以下文章

sap如何导出单张凭证

Django-Haystack 使用带有 IAM 凭证的 Amazon Elasticsearch 托管

记账凭证要打钩吗?

Alamofire V3 如何使凭证无效

uipath获取Windows凭证

跪求NC凭证接口和NC凭证自动导入的流程图?