3

I'm trying to display a user's profile on a project. I'd like to render a form but make it disabled/unable to be changed (just displayed). I can't figure out the syntax for it. Help would be appreciated!

Here's the view.py:

@login_required
def profile(request):
    user_form = UserForm(instance=request.user)
    user_form.fields.disabled = True <------- HELP HERE
    return render(request, 'rentadevapp/profile.html', {'user_form': user_form})

I essentially want to just display a readonly/disabled form. User then has an edit button that takes them to a profile edit page.

Thanks for the help!

Here's the html just in case:

 <form method="GET" action="/profile_edit">{% csrf_token %}
                {{ user_form|crispy }}
                <button type="submit" class="edit btn btn-default btn-block btn-lg">Edit</button><br>
            </form>

Forms.py

class UserForm(forms.ModelForm):

    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Repeat password', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email')
James Franco
  • 53
  • 1
  • 7

2 Answers2

3

Because it seems you are using django-crispy-forms, I would use the following:

class UserForm(forms.ModelForm):

    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Repeat password', widget=forms.PasswordInput)

    def __init__(self,disable_fields=False, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if disable_fields:
            self.fields['password'].disabled = True
            self.fields['password2'].disabled = True

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email')

So when you are going to create the form, this should make it work:

@login_required
def profile(request):
    user_form = UserForm(instance=request.user, disable=True)
    return render(request, 'rentadevapp/profile.html', {'user_form': user_form})
rahnama7m
  • 865
  • 10
  • 38
lmiguelvargasf
  • 63,191
  • 45
  • 217
  • 228
2

Django 1.9 added the Field.disabled attribute: https://docs.djangoproject.com/en/stable/ref/forms/fields/#disabled

The disabled boolean argument, when set to True, disables a form field using the disabled HTML attribute so that it won’t be editable by users. Even if a user tampers with the field’s value submitted to the server, it will be ignored in favor of the value from the form’s initial data.

You can do this to disable the fields you want in your view:

@login_required
def profile(request):
    user_form = UserForm(instance=request.user)
    for fieldname in user_form.fields:
        user_form.fields[fieldname].disabled = True
    return render(request, 'rentadevapp/profile.html', {'user_form': user_form})
icyfire
  • 1,170
  • 8
  • 21