Python Django用户登录表单用户为无

Python Django用户登录表单用户为无,python,html,django,forms,login,Python,Html,Django,Forms,Login,我在登录用户时遇到一些问题。我有以下视图和模板: views.py def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = auth.authenticate(username=username, password=passwo

我在登录用户时遇到一些问题。我有以下视图和模板:

views.py

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = auth.authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                auth.login(request, user)
                return HttpResponseRedirect('/')
            else:
                return HttpResponseRedirect('disabled account')

        else:
            return HttpResponseRedirect('/invalid')

    else:
        return render(request, 'login_page.html', {})
登录页面.html

{% block content %}

    {% if form.errors %}
        <p class="error"> sorry, thats not a valid username or password</p>
    {% endif %}

<form action="/login/" method="post"> 
    <label for="username">User name:</label>
    <input type="text" name="username" value="" id="username">
    <label for="password">Password:</label>
    <input type="text" name="password" value="" id="password">

    <input type="submit" value="login" />

</form>

{% endblock %}
{% block content %}

    {% if form.errors %}
        <p class="error"> sorry, thats not a valid username or password</p>
    {% endif %}

<form action="{% url 'login' %}" method="post"> 
    {{  form  }}
    <input type="submit" value="login" />
</form>

{% endblock %}
更新表格:

from django import forms
from django.contrib.auth import authenticate, login, logout, get_user_model

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

def clean(self, *args, **kwargs):
    username = self.cleaned_data.get("username")
    password = self.cleaned_data.get("password")
    if username and password:
        user = authenticate(username=username, password=password)
        if not user:
            raise forms.ValidationError("User does not exist.")
        if not user.is_active:
            raise forms.ValidationError("User is no longer active.")
    return super(UserLoginForm, self).clean(*args, **kwargs)
更新了login_page.html

{% block content %}

    {% if form.errors %}
        <p class="error"> sorry, thats not a valid username or password</p>
    {% endif %}

<form action="/login/" method="post"> 
    <label for="username">User name:</label>
    <input type="text" name="username" value="" id="username">
    <label for="password">Password:</label>
    <input type="text" name="password" value="" id="password">

    <input type="submit" value="login" />

</form>

{% endblock %}
{% block content %}

    {% if form.errors %}
        <p class="error"> sorry, thats not a valid username or password</p>
    {% endif %}

<form action="{% url 'login' %}" method="post"> 
    {{  form  }}
    <input type="submit" value="login" />
</form>

{% endblock %}

我建议您创建一个forms.py文件,并在这里创建一个如下所示的类:

from django import forms
from django.contrib.auth import authenticate, login, logout, get_user_model

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

    def clean(self, *args, **kwargs):
        username = self.cleaned_data.get("username")
        password = self.cleaned_data.get("password")
        if username and password:
            user = authenticate(username=username, password=password)
            if not user:
                raise forms.ValidationError("User does not exist.")
            if not user.is_active:
                raise forms.ValidationError("User is no longer active.")
        return super(UserLoginForm, self).clean(*args, **kwargs)
然后在视图中导入登录表单。创建这样的视图:

def my_login_view(request):
    form = LoginForm(request.POST)
    if form.is_valid():
        username = form.cleaned_data["username"]
        password = form.cleaned_data["password"]
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('someurl')
            else:
                return redirect('someotherurl')
    return render(request, "your_template_to_process_this_view", {'form': form})
在html模板中,您可以使用下面的约定调用表单。要使此url快捷方式正常工作,您需要在url文件顶部添加一个app_name=“yourappname”

<form method="POST" action="{% url 'yourappname:name_given_to_url_in_urls_file' %}">
  {% csrf_token %}
  {{ form }}
<input type="submit" class="btn-success" value="Login"/>
</form>

{%csrf_令牌%}
{{form}}

我想你的注册码可能是错的。 我们应该使用
设置密码

def register(request):
if request.method == 'POST':
    reg = User()
    reg.username = request.POST['register_username']
    reg.set_password(request.POST['register_password']) #like this line
    reg.save()

not reg.password=request.POST['register\u password']

用户条目确实存在,而且我正在正确地输入详细信息,这就是我遇到的问题。请尝试使用django
django.contrib.auth.forms.AuthenticationForm提供的。然后您可以得到错误描述。我得到一个名称错误“名称‘LoginForm’未定义”。您需要在视图文件中导入它:从.forms导入LoginForm,并确保在视图文件中有其他必需的导入。修复了该问题,它现在可以工作了,除了我回到了第一个问题——在表单中提交用户数据只会返回一个刷新的登录页面。它正在处理所有内容,但被不正确地重定向。在查看函数my_login(我的登录)视图中,您需要为此创建一个url,例如url(r“^login/$”,views.my_login(我的登录)视图,name='login'),其操作形式为您调用在本例中登录的url的名称。然后,您需要创建登录后需要发送给用户的页面。你可以用这个url替换“someurl”以进入帐户或主页等。顺便问一下,如果这样做有效,你可以放弃它或接受它,以便其他用户可以使用它。谢谢。我有,所以我认为这不是问题所在(url(r'^login/',views.login,name='login'))