You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Django房产管理网站添加登录额外字段并通过Session识别用户

问题原因

这个错误是因为LoginView会将request参数传递给认证表单,但你自定义的UserLoginForm继承自forms.Form,它的构造函数不接受request参数。Django默认的AuthenticationForm是专门为登录场景设计的,其__init__方法原生支持request参数,因此只需调整表单的继承关系即可解决问题。

解决方案

1. 修改登录表单代码

让自定义表单继承AuthenticationForm,并直接在表单类中定义user_type字段:

from django.contrib.auth.forms import AuthenticationForm
from django import forms

USER_TYPE_CHOICES = (
    ('landlord', 'Landlord'),
    ('agent', 'Agent'),
    ('prospect', 'Prospect'),
)

class UserLoginForm(AuthenticationForm):
    user_type = forms.ChoiceField(
        choices=USER_TYPE_CHOICES,
        widget=forms.Select(attrs={'class': 'form-control left-label'})
    )

2. 调整登录视图代码

移除视图中重复添加user_type字段的逻辑(表单已定义该字段),保留用户类型匹配检查的核心逻辑:

from django.contrib.auth.views import LoginView
from django.contrib.auth import login
from django.contrib import messages

class MyLoginView(LoginView):
    template_name = 'account/login.html'
    authentication_form = UserLoginForm

    def form_valid(self, form):
        user = form.get_user()
        user_type = form.cleaned_data['user_type']
        
        # 检查所选用户类型是否与用户实际身份匹配
        if user_type == 'landlord' and not user.profile.landlord:
            messages.error(self.request, '该用户不属于房东类型。')
            return self.form_invalid(form)
        elif user_type == 'agent' and not hasattr(user, 'agent'):
            messages.error(self.request, '该用户不属于经纪人类型。')
            return self.form_invalid(form)
        elif user_type == 'prospect' and not hasattr(user, 'prospect'):
            messages.error(self.request, '该用户不属于潜在客户类型。')
            return self.form_invalid(form)
        
        login(self.request, user)
        self.request.session['user_type'] = user_type
        return super().form_valid(form)

补充说明

  • 表单继承AuthenticationForm后,自动兼容LoginView传递的request参数,彻底解决构造函数报错问题。
  • 确保登录模板login.html中渲染user_type字段,比如添加:
    <div class="form-group">
        {{ form.user_type.label_tag }}
        {{ form.user_type }}
        {% if form.user_type.errors %}
            {% for error in form.user_type.errors %}
                <small class="text-danger">{{ error }}</small>
            {% endfor %}
        {% endif %}
    </div>
    

内容的提问来源于stack exchange,提问作者apollos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:43:08