Django UserChangeForm некорректно отображает ссылку "this form" с помощью form.as_p
Я пытаюсь отобразить его с помощью form.as_p, и он отображается в основном так, как должен. Однако ссылка на раздел смены пароля отображается неправильно. Вместо синей ссылки на "этой форме" я получаю...
"Сырые пароли не хранятся, поэтому нет возможности увидеть пароль этого пользователя, но вы можете изменить пароль с помощью этой формы." Кто-нибудь сталкивался с этой проблемой?
вот мой HTML:
{% extends 'base.html' %}
{% block title %}Edit Profile{% endblock %}
{% block content %}
<h1>Edit Profile...</h1>
<br/>
<div class="form-group">
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-secondary">Update Profile</button>
</form>
</div>
{% endblock %}
И мой forms.py:
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
from django import forms
class EditProfileForm(UserChangeForm):
email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
first_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
last_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
username = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
last_login = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
is_superuser = forms.CharField(max_length=100, widget=forms.CheckboxInput(attrs={'class': 'form-check'}))
is_staff = forms.CharField(max_length=100, widget=forms.CheckboxInput(attrs={'class': 'form-check'}))
is_active = forms.CharField(max_length=100, widget=forms.CheckboxInput(attrs={'class': 'form-check'}))
date_joined = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password', 'last_login', 'is_superuser', 'is_staff', 'is_active', 'date_joined')
Views.py:
from django.shortcuts import render
from django.views import generic
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.urls import reverse_lazy
from .forms import SignUpForm, EditProfileForm
from members.forms import SignUpForm
class UserRegisterView(generic.CreateView):
form_class = SignUpForm
template_name = 'registration/register.html'
success_url = reverse_lazy('login')
class UserEditView(generic.UpdateView):
form_class = EditProfileForm
template_name = 'registration/edit_profile.html'
success_url = reverse_lazy('home')
def get_object(self):
return self.request.user
urls.py:
from django.urls import path
from .views import UserRegisterView, UserEditView
from django.contrib.auth import views as auth_views
urlpatterns = [
path('register/', UserRegisterView.as_view(), name="register"),
path('edit_profile/', UserEditView.as_view(), name="edit_profile"),
path('password/', auth_views.PasswordChangeView.as_view())
Все отображается правильно, за исключением того, что я получаю следующее на странице для раздела пароля:
Пароли не хранятся, поэтому нет возможности увидеть пароль этого пользователя, но вы можете изменить пароль, используя < a href="../password/">эту форму< a >.
Кто-нибудь знает, как это исправить?
В последних версиях Django текст справки не safe по умолчанию и UserChangeForm
не был обновлен, чтобы отразить это изменение.
Для получения желаемого результата необходимо переопределить password
с mark_safe
в UserChangeForm
:
from django.contrib.auth.forms import ReadOnlyPasswordHashField, UserChangeForm
from django.utils.safestring import mark_safe
class UserEditView(UserChangeForm):
password = ReadOnlyPasswordHashField(
label=("Password"),
help_text=mark_safe(
'Raw passwords are not stored, so there is no way to see this '
'user’s password, but you can change the password using '
'<a href="{}">this form</a>.'
),
)
...