【问题标题】:Can't display email field using django allauth无法使用 django allauth 显示电子邮件字段
【发布时间】:2016-09-16 21:37:31
【问题描述】:

我有一个问题,在我的 login.html 文件中,电子邮件字段不会显示。这是html代码:

<form method="POST" id="signup_form" action="{% url 'account_login' %}" class="registration-form">{% csrf_token %}
    <div class="form-group">
        <!-- <input type="text" name="email" placeholder="Email" class="form-email form-control" id="form-email"> -->
        {{ form.email }}
    </div>

    <div class="form-group">
        <!-- <input type="password" name="password" placeholder="Lozinka" class="form-about-yourself form-control" id="form-about-yourself"></input> -->
        {{ form.password}}
    </div>

    {% if redirect_field_value %}
        <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
    {% endif %}

    <a class="button secondaryAction" href="{% url 'account_reset_password' %}">
        {% trans "Zaboravili ste oznaku?" %}
    </a>
    <br>

    <button type="submit" class="btn">Prijavite se</button>
</form>

所以电子邮件字段不会显示,但密码字段会显示。还显示密码字段,但我无法自定义它。以下是我的尝试:

class AuthenticationForm(forms.ModelForm):
    """
    Login form
    """
    class Meta:
        model = get_user_model()
        fields = ['email', 'password']


    def __init__(self, *args, **kwargs):
        super(AuthenticationForm, self).__init__(*args, **kwargs)

        self.fields['email'].widget = forms.EmailInput(attrs={
            'placeholder': 'Email adresa*',
            'required': True,
            'class': "form-email form-control"
            })

        self.fields['password'].widget = forms.PasswordInput(attrs={
            'placeholder': 'Lozinka*',
            'required': True,
            'class': "form-first-name form-control"
            })

我的注册页面拥有所有这些,并且运行良好。我尝试使用 form.as_p 并且效果很好,但我想要自己的风格。感谢您的宝贵时间。

【问题讨论】:

    标签: html django django-forms django-allauth


    【解决方案1】:

    使用{{ form.login }} 来显示电子邮件字段,而不是{{ form.email }}


    https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py可以看到Django登录表单有三个字段,登录名、密码和记住。所以在你的情况下就做

    <form method="POST" id="signup_form" action="{% url 'account_login' %}" class="registration-form">{% csrf_token %}
        <div class="form-group">
            <!-- <input type="text" name="email" placeholder="Email" class="form-email form-control" id="form-email"> -->
            {{ form.login}}
        </div>
    
        <div class="form-group">
            <!-- <input type="password" name="password" placeholder="Lozinka" class="form-about-yourself form-control" id="form-about-yourself"></input> -->
            {{ form.password}}
        </div>
    
        {% if redirect_field_value %}
            <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
        {% endif %}
    
        <a class="button secondaryAction" href="{% url 'account_reset_password' %}">
            {% trans "Zaboravili ste oznaku?" %}
        </a>
        <br>
    
        <button type="submit" class="btn">Prijavite se</button>
    </form>
    

    【讨论】:

      【解决方案2】:

      我不是 django 专家,但如果您只想设置输入样式,最好使用 django-widget-tweaks。它使样式和 python 代码保持分离。

      所以首先你可以安装它:

      pip install django-widget-tweaks
      

      然后将“widget_tweaks”添加到 INSTALLED_APPS。

      在您的模板中加载 widget_tweaks:

      {% load widget_tweaks %}
      

      在你的情况下,你会这样写:

      {% render_field form.email placeholder='Email adresa*' required="required" class="form-email form-control" %}
      
      {% render_field form.password placeholder='Lozinka*' required="required" class="form-first-name form-control" type="password" %}
      

      在您的模板中,而不是:

      {{ form.email }}
      {{ form.password }}
      

      如果您选择这样做,我认为您的AuthenticationForm 中不需要__init__() 方法

      编辑1: 在我的情况下,我还必须将 type="password" 添加到密码 render_field 标签

      【讨论】:

      • 感谢您的回答,但电子邮件字段仍未显示。密码字段是,并且它已更改,但是当我运行服务器时,html中没有电子邮件字段。
      • 如果您使用 Django 的默认登录视图进行身份验证,那么 Django 会将 AuthenticationFormdjango.contrib.auth.forms 传递给您的模板。此表单仅包含用户名和密码字段,这就是您的电子邮件字段未显示的原因。如果您想使用电子邮件字段来登录用户,请阅读these 答案并查看适合您的方法。最简单的解决方案当然是使用用户名字段进行用户登录。
      猜你喜欢
      • 2018-09-11
      • 2018-09-14
      • 2016-07-02
      • 2014-11-09
      • 2020-10-26
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多