Django表单初始值在保存后更改
我使用从django的UserCreationForm继承的自定义表单来添加用户。无论如何,我必须为用户名字段设置不同的初始值。它工作得很好,但在点击保存按钮后,用户将使用与表单中显示的初始值不同的用户名进行保存。您可以在下面找到代码Django表单初始值在保存后更改,django,python-3.x,django-forms,Django,Python 3.x,Django Forms,我使用从django的UserCreationForm继承的自定义表单来添加用户。无论如何,我必须为用户名字段设置不同的初始值。它工作得很好,但在点击保存按钮后,用户将使用与表单中显示的初始值不同的用户名进行保存。您可以在下面找到代码 from django.contrib.auth.forms import UserCreationForm class AdminUserCreationForm(UserCreationForm): """ AdminForm for c
from django.contrib.auth.forms import UserCreationForm
class AdminUserCreationForm(UserCreationForm):
"""
AdminForm for creating an instance of custom USER_MODEL.
"""
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("username", "email")
field_classes = {'username': UsernameField}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.initial['username'] = random_username_generator()
self.fields['username'].disabled = True
self.fields['password1'].required = False
self.fields['password2'].required = False
def clean_username(self):
username = self.cleaned_data['username'].lower()
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError('A user with username {} already exists'.format(username))
def clean_email(self):
email = self.cleaned_data['email'].lower()
try:
User.objects.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError('A user with email {} already exists'.format(email))
def save(self, commit=True):
import ipdb; ipdb.set_trace();
user = super(AdminUserCreationForm, self).save(commit=False)
# user = self.instance
qb = QuickBlox()
qb_password = reset_password_generator()
user.qb_password = qb_password + 'vx'
user.save()
attempt = LoginAttempts()
attempt.user = user
attempt.save()
send_invite_mail(user)
return user
表单的init被调用两次。表单送达时,一次在GET请求中,一次在POST请求中,第一个请求的初始用户名可能已发布。然后表单保存在
request.POST
中发布的值,而不是字段的初始值。如果用户没有键入不同的内容,则保存的值可能是上一个请求的初始值。我将此字段设置为disabled=True。但在点击save somehowGets后,它仍然会更改。从哪个状态更改?根据您在隐藏输入中看到的内容或post请求过程中的初始值?@Schwobasegll在初始屏幕上更新了我的问题,表单中显示的用户名不是在点击saveDisabled inputs后保存到db的用户名,根本不提交。因此,将获取下一个表单实例化的初始值,该值将再次调用随机函数。如果在表单的init中记录/打印初始值,就可以看到这一点。