从Django UserCreateForm中删除help_text

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>
11个回答

60
您可以在__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 

但在你的情况下,我的解决方案将非常有效。


抛出了这个错误:列表索引必须是整数或切片,而不是字符串。 - Enrico
第二个版本效果最好,而且非常简单。password1 = forms.CharField(label='密码', widget=forms.PasswordInput, help_text='至少8个字符。') - nihilok

22

另一种更清晰的选项是在类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/stable/topics/forms/modelforms/#overriding-the-default-fields

对于用户名和电子邮件而言完美运作,但对于密码2则不起作用。不知道为什么。


对于我的外键来说很有效。谢谢! - texnic
4
我同意文档上说这个应该可以工作,但是对我来说它没有任何效果,即使是usernamepassword1也不行。如果有人知道需要什么才能让这个选项生效,我希望你能分享一下。我调试了一段时间,但当我渲染这个表单时,Django甚至都没有接触到任何help_texts字段。 - Henrik Heimbuerger
2
请查看此段落中的第一个绿色框(“注意”):https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/#overriding-the-default-fields。 - Marc
确实更加清晰。您还可以使用 help_texts = {k:“” for k in fields} 来删除所有帮助文本。 - zar3bski
@HenrikHeimbuerger 在 Django 文档中,他们正在子类化 forms.ModelForm。在 @iustitia 的答案中,他正在子类化 UserCreationForm。这可能是为什么文档在那种情况下有效的原因。 - Jarad
它不能适用于“password2”的原因是“help_text”用于密码验证规则列表。 - Salvatore Iovene

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

<style>

.helptext{
  visibility: hidden;
}

</style>


2
问题是关于在HTML中删除的,那么CSS不能完成这项工作。 - freezed

6
简单的CSS解决方案。
<style>
     #hint_id_username, #hint_id_password1 {
         display: none;
     }
</style>

当表单渲染后,请检查页面源代码,您会看到每个帮助文本的id。例如,每个表单字段的 hint_id_username。使用上述CSS来隐藏文本。

4
我遇到了类似的问题。基于其中一条评论,我在阅读文档后找到了解决方案。
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,
        }

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


这是帮助我理解手头问题的文档:https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/#overriding-the-default-fields - Ajay Shah

1

1

如果您想更改密码1和2的默认文本,而不必重新创建默认模型,则可以尝试像我一样操作。只需在类元数据下方添加此init函数即可。

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

0

只需转到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."),
)

该问题已经有一个被接受的答案,请避免回答旧问题,如果没有为现有答案添加任何新内容。 - user12291970

0

只需覆盖字段的 help_text 属性。

例如:

username = forms.CharField(help_text=None)

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


0
如果你想要从自定义的SignUpForm中移除字段的帮助文本,你可以重写init方法,并将每个字段的help_text属性设置为空字符串。以下是如何实现的方法:

移除所有字段的帮助文本

    for field_name in self.fields:
        self.fields[field_name].help_text = ''

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接