zoukankan      html  css  js  c++  java
  • django-admin自定义登录

    这个效果,单位代码是User model 的一个外键Company
    通过修改form,然后在前端显示
    修改form

    class AuthenticationForm(forms.Form):
        """
        Base class for authenticating users. Extend this to get a form that accepts
        username/password logins.
        """
        username = forms.CharField(max_length=254)
        password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
    #自定义一个company_form
        company = forms.CharField(max_length=254)
    
        error_messages = {
            'invalid_login': _("Please enter a correct %(username)s and password. "
                               "Note that both fields may be case-sensitive."),
            'inactive': _("This account is inactive."),
        }
    
        def __init__(self, request=None, *args, **kwargs):
            """
            The 'request' parameter is set for custom auth use by subclasses.
            The form data comes in via the standard 'data' kwarg.
            """
            self.request = request
            self.user_cache = None
            super(AuthenticationForm, self).__init__(*args, **kwargs)
    
            # Set the label for the "username" field.
            UserModel = get_user_model()
            self.username_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD)
            if self.fields['username'].label is None:
                self.fields['username'].label = capfirst(self.username_field.verbose_name)
    
        def clean(self):
            username = self.cleaned_data.get('username')
            password = self.cleaned_data.get('password')
    #有修改
            company = self.cleaned_data.get('company')
            if username and password and company:
                self.user_cache = authenticate(username=username,
                                               password=password,
                                               company=company)
                if self.user_cache is None:
                    raise forms.ValidationError(
                        self.error_messages['invalid_login'],
                        code='invalid_login',
                        params={'username': self.username_field.verbose_name},
                    )
                else:
                    self.confirm_login_allowed(self.user_cache)
    
            return self.cleaned_data
    

    在admin form 当中找到这串代码,主要是admin login 登录界面会引用,修改部分代码然后在views当中修改login

    from forms import AuthenticationForm
    @deprecate_current_app
    @sensitive_post_parameters()
    @csrf_protect
    @never_cache
    def login(request, template_name='admin/login.html',
              redirect_field_name=REDIRECT_FIELD_NAME,
              authentication_form=AuthenticationForm,
              extra_context=None):
        """
        Displays the login form and handles the login action.
        """
        redirect_to = request.POST.get(redirect_field_name,
                                       request.GET.get(redirect_field_name, ''))
    
        if request.method == "POST":
            form = authentication_form(request, data=request.POST)
            if form.is_valid():
    
                # Ensure the user-originating redirection url is safe.
                if not is_safe_url(url=redirect_to, host=request.get_host()):
                    redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
    
                # Okay, security check complete. Log the user in.
                auth_login(request, form.get_user())
    
                return HttpResponseRedirect(redirect_to)
        else:
            form = authentication_form(request)
    
        current_site = get_current_site(request)
    
        context = {
            'form': form,
            redirect_field_name: redirect_to,
            'site': current_site,
            'site_name': current_site.name,
        }
        if extra_context is not None:
            context.update(extra_context)
    
        return TemplateResponse(request, template_name, context)
    

    引用自定义的form然后跳转到自定义的login页面

    {% extends "admin/base_site.html" %}
    {% load staticfiles %}
    
    {% load i18n admin_static %}
    
    
    {% block extrastyle %}{{ block.super }}{{ form.media }}<link rel="stylesheet" type="text/css" href='{% static "admin/css/login.css" %}'>
    {% endblock %}
    
    {% block bodyclass %}{{ block.super }} login{% endblock %}
    
    {% block usertools %}{% endblock %}
    
    {% block nav-global %}{% endblock %}
    
    {% block content_title %}{% endblock %}
    
    {% block breadcrumbs %}{% endblock %}
    
    {% block content %}
    {% if form.errors and not form.non_field_errors %}
    <p class="errornote">
    {% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
    </p>
    {% endif %}
    
    {% if form.non_field_errors %}
    {% for error in form.non_field_errors %}
    <p class="errornote">
        {{ error }}
    </p>
    {% endfor %}
    {% endif %}
    
    <div id="content-main">
    
    {% if user.is_authenticated %}
    <p class="errornote">
    {% blocktrans with username=request.user.get_username trimmed %}
        You are authenticated as {{ username }}, but are not authorized to
        access this page. Would you like to login to a different account?
    {% endblocktrans %}
    </p>
    {% endif %}
    
    <form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
    <div class="form-row">
        {{ form.company.errors }}
        <p>公司代码</p>
        {{ form.company }}
      </div>
      <div class="form-row">
        {{ form.username.errors }}
        <p>用户名</p>
        {{ form.username }}
      </div>
      <div class="form-row">
        {{ form.password.errors }}
        {{ form.password.label_tag }} {{ form.password }}
        <input type="hidden" name="next" value="{{ next }}" />
      </div>
      {% url 'admin_password_reset' as password_reset_url %}
      {% if password_reset_url %}
      <div class="password-reset-link">
        <a href="{{ password_reset_url }}">{% trans 'Forgotten your password or username?' %}</a>
      </div>
      {% endif %}
      <div class="submit-row">
        <label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}" />
      </div>
    </form>
    /*调节样式*/
    <script type="text/javascript">
    document.getElementById('id_username').focus();
    var company = document.getElementById('id_company');
    company.style.height = '23px';
    company.style.width = '339px';
    </script>
    </div>
    {% endblock %}
    
  • 相关阅读:
    Codeforces Round #555 (Div. 3) A B C1(很水的题目)
    蓝桥杯国赛之阶乘位数
    POJ-1258 Agri-Net(最小生成树)
    昂贵的聘礼(枚举区间+最短路)
    地斗主(矩阵快速幂)
    救救兔子(二分)
    shell编程之sed编辑器&gawk程序
    typedef&nbsp;struct与struct的区别
    iOS内存管理编程指南
    Object&nbsp;c&nbsp;基础知识
  • 原文地址:https://www.cnblogs.com/wuqingzangyue/p/5457704.html
Copyright © 2011-2022 走看看