Removing help_text from Django UserCreateForm

Question:

Probably a poor question, but I’m using Django’s UserCreationForm (slightly modified to include email), and I would like to remove the help_text that Django automatically displays on the HTML page.

On the Register portion of my HTML page, it has the Username, Email, Password1 & Password 2 fields. But underneath Username is "Required. 30 characters or fewer. Letters, digits, and @… only." And under Password Confirmation (Password 2), it says "Enter the same password as above for verification."

How do I remove these?

#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>
Asked By: Chris Yin

||

Answers:

You can set help_text of fields to None in __init__

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()

output:

<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>

If you are doing too many changes, in such cases it is better to just override the fields e.g.

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

but in your case my solution will work very well.

Answered By: Anurag Uniyal

You can add css class to registration_form.html file like this.

<style>

.helptext{
  visibility: hidden;
}

</style>

Another, cleaner option is to use help_texts dictionary in class Meta. Example:

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

More info in here: https://docs.djangoproject.com/en/stable/topics/forms/modelforms/#overriding-the-default-fields

Works perfect for username and email, but doesn’t work for password2. No idea why.

Answered By: iustitia

Simple CSS solution.

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

When the forms render inspect the page source code and you will see an id for each help text. Such as hint_id_username for each form field. Use the above CSS to hide the text.

Answered By: kvothe__

Just go to UserCreationForm and make the required changes.

very simple hold control button on your keyboard and ckick on UserCreationForm you will get the UserCreationForm make the required changes as per your need and save it. as i did it for me in the below example i commented the Help Content.

  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."),
)

Or just iterate through form fields and omit to ouput "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 doc:
https://docs.djangoproject.com/en/3.0/topics/forms/#looping-over-the-form-s-fields

Answered By: cristian

I had a similar issue. Based on one of the comments, here is the solution after reading the documentation.

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,
        }

Basically what we are trying to do is over-ride the automated setting by re-creating the password fields for our new class form.

Answered By: Ajay Shah

For those who want to change the default text for a password 1 and 2 without having to recreate your default model, can try doing like i did. Just add this init function right under your class meta.

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

Add this CSS in order to remove help text.

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

Just override the field’s help_text property.

For example

username = forms.CharField(help_text=None)

You don’t need to change any other parameters. It will work fine.

Answered By: Praveen Kumar