【问题标题】:Removing help_text from Django UserCreateForm从 Django UserCreateForm 中删除 help_text
【发布时间】:2012-10-23 13:28:37
【问题描述】:

可能是一个糟糕的问题,但我正在使用 Django 的 UserCreationForm(稍作修改以包含电子邮件),并且我想删除 Django 自动显示在 HTML 页面上的 help_text。

在我的 HTML 页面的注册部分,它有用户名、电子邮件、密码 1 和密码 2 字段。但在用户名下方是“必需的。30 个字符或更少。字母、数字和 @... 仅限。”在密码确认(密码 2)下,显示“输入与上述相同的密码进行验证”。

如何删除这些?

#models.py
class UserCreateForm(UserCreationForm):
    email = forms.EmailField(required=True)

    def save(self, commit=True):
        user = super(UserCreateForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        if commit:
            user.save()
        return user

    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")
        exclude = ('username.help_text')

#views.py
def index(request):
    r = Movie.objects.all().order_by('-pub_date')
    form = UserCreateForm()
    return render_to_response('qanda/index.html', {'latest_movie_list': r, 'form':form},     context_instance = RequestContext(request))

#index.html
<form action = "/home/register/" method = "post" id = "register">{% csrf_token %}
    <h6> Create an account </h6>
    {{ form.as_p }}
    <input type = "submit" value = "Create!">
    <input type = "hidden" name = "next" value = "{{ next|escape }}" />
</form>

【问题讨论】:

    标签: python django django-models django-registration


    【解决方案1】:

    您可以在__init__中将help_text的字段设置为None

    from django.contrib.auth.forms import UserCreationForm
    from django import forms
    
    class UserCreateForm(UserCreationForm):
        email = forms.EmailField(required=True)
    
        def __init__(self, *args, **kwargs):
            super(UserCreateForm, self).__init__(*args, **kwargs)
    
            for fieldname in ['username', 'password1', 'password2']:
                self.fields[fieldname].help_text = None
    
    print UserCreateForm()
    

    输出:

    <tr><th><label for="id_username">Username:</label></th><td><input id="id_username" type="text" name="username" maxlength="30" /></td></tr>
    <tr><th><label for="id_password1">Password:</label></th><td><input type="password" name="password1" id="id_password1" /></td></tr>
    <tr><th><label for="id_password2">Password confirmation:</label></th><td><input type="password" name="password2" id="id_password2" /></td></tr>
    <tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr>
    

    如果您要进行太多更改,在这种情况下,最好只覆盖字段,例如

    class UserCreateForm(UserCreationForm):
        password2 = forms.CharField(label=_("Whatever"), widget=MyPasswordInput 
    

    但在你的情况下,我的解决方案会很好用。

    【讨论】:

    • 抛出这个错误:列表索引必须是整数或切片,而不是 str
    • 第二个版本效果最好,而且非常简单。 password1 = forms.CharField(label='Password', widget=forms.PasswordInput, help_text='Minimum 8 characters.')
    【解决方案2】:

    另一个更简洁的选择是在 Meta 类中使用 help_texts 字典。示例:

    class UserCreateForm(UserCreationForm):
        ...
        class Meta:
            model = User
            fields = ("username", "email", "password1", "password2")
            help_texts = {
                'username': None,
                'email': None,
            }
    

    更多信息在这里:https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#overriding-the-default-fields

    适用于用户名和电子邮件,但不适用于密码2。不知道为什么。

    【讨论】:

    • 为我工作的外键。谢谢!
    • 我同意文档说这应该有效,但它对我也没有影响,甚至对usernamepassword1 也没有影响。如果有人有更多关于申请此选项所需的信息,如果您能分享,我将不胜感激。我调试了一段时间,但是当我渲染这个表单时,Django 甚至没有接近任何help_texts 字段。
    • 查看本段第一个绿色框(“注”):docs.djangoproject.com/en/3.0/topics/forms/modelforms/…
    • 确实更干净。您也可以使用help_texts = {k:"" for k in fields} 删除所有帮助文本
    • @HenrikHeimbuerger 在 Django 文档中,它们是 forms.ModelForm 的子类。在@iustitia 的回答中,他继承了UserCreationForm。这可能就是文档在这种情况下起作用的原因。
    【解决方案3】:

    您可以像这样将css类添加到registration_form.html文件中。

    <style>
    
    .helptext{
      visibility: hidden;
    }
    
    </style>

    【讨论】:

    • 问题是关于在 HTML 中删除,那么 CSS 就不能完成这项工作。
    【解决方案4】:

    简单的 CSS 解决方案。

    <style>
         #hint_id_username, #hint_id_password1 {
             display: none;
         }
    </style>
    

    当表单呈现时检查页面源代码,您将看到每个帮助文本的 id。例如每个表单字段的hint_id_username。使用上面的 CSS 隐藏文本。

    【讨论】:

      【解决方案5】:

      我遇到了类似的问题。基于其中一个cmet,这里是阅读文档后的解决方案。

      class UserCreateForm(UserCreationForm):
          password1 = forms.CharField(label='Enter password', 
                                      widget=forms.PasswordInput)
          password2 = forms.CharField(label='Confirm password', 
                                      widget=forms.PasswordInput)
          class Meta:
              model=User
              fields=("username","email","first_name",
                      "last_name","password1","password2")
              help_texts = {
                  "username":None,
              }
      

      基本上,我们试图做的是通过为我们的新类表单重新创建密码字段来覆盖自动设置。

      【讨论】:

      【解决方案6】:

      或者只是遍历表单字段并省略输出“field.help_text”

      {% for field in form %}
          <div class="fieldWrapper">
              {{ field.errors }}
              {{ field.label_tag }} {{ field }}
              <!--
              {% if field.help_text %}
                 <p class="help">{{ field.help_text|safe }}</p>
              {% endif %}
              -->
          </div>
      {% endfor %}
      

      Django 文档: https://docs.djangoproject.com/en/3.0/topics/forms/#looping-over-the-form-s-fields

      【讨论】:

        【解决方案7】:

        只需转到 UserCreationForm 并进行所需的更改。

        非常简单的按住键盘上的控制按钮并点击 UserCreationForm 您将获得 UserCreationForm 根据您的需要进行所需的更改并保存它。正如我在下面的示例中为我所做的那样,我评论了帮助内容。

          error_messages = {
            'password_mismatch': _("The two password fields didn't match."),
        }
        password1 = forms.CharField(
            label=_("Password"),
            strip=False,
            widget=forms.PasswordInput,
            # help_text=password_validation.password_validators_help_text_html(),
        )
        password2 = forms.CharField(
            label=_("Password confirmation"),
            widget=forms.PasswordInput,
            strip=False,
            help_text=_("Enter the same password as before, for verification."),
        )
        

        【讨论】:

        • 该问题已经有一个可接受的答案,如果它没有在现有答案中添加任何新内容,请避免回答旧问题。
        【解决方案8】:

        对于那些想要更改密码 1 和 2 的默认文本而无需重新创建默认模型的人,可以尝试像我一样做。只需在你的类元下面添加这个初始化函数。

        def __init__(self, *args, **kwargs):
              super().__init__(*args, **kwargs)
              self.fields['password1'].help_text='Your text'
              self.fields['password2'].help_text='Your text'
        

        【讨论】:

          【解决方案9】:

          只需覆盖字段的 help_text 属性即可。

          例如

          username = forms.CharField(help_text=None)
          

          您不需要更改任何其他参数。它会正常工作的。

          【讨论】:

            【解决方案10】:

            添加此 CSS 以删除帮助文本。

            <style>
                .helptext {
                  visibility: hidden;
                }
                body > main > form > ul > li{
                  display: none;
                }
             </style>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-01-20
              • 2015-02-09
              • 2016-06-20
              • 1970-01-01
              • 2018-08-20
              • 1970-01-01
              • 2012-12-17
              • 2016-02-28
              相关资源
              最近更新 更多