Я использую версию Django 2.1.
Я создал модель AuthUserProfile
и хочу обновить данные в моделях User
и AuthUserProfile
. Для этого я создал ModelForm, который переопределил его метод __init__()
.
В чем проблема, с которой я сталкиваюсь: я не могу обновить () существующие данные в User
и AuthUserProfile
модели, и я не получаю ошибки
Модель AuthUserProfile
class AuthUserProfile(models.Model):
user_profile_id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
dob = models.DateField(blank=True, null=True)
is_deleted = models.PositiveSmallIntegerField(default=0)
created_at = models.DateTimeField(auto_now=datetime.now(), null=True)
updated_at = models.DateTimeField(auto_now=datetime.now(), null=True)
class Meta():
db_table = 'auth_user_profile'
verbose_name = 'User Profile'
verbose_name_plural = 'User Profiles'
ModelForm: forms.py
class CreateUserProfileForm(ModelForm):
user = forms.CharField(
max_length=25, widget=forms.HiddenInput(attrs={'class': 'form-control', 'id': 'user', }), required=False,
)
first_name = forms.CharField(
max_length=25, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'first_name', }), required=True,
)
last_name = forms.CharField(
max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'last_name', }), required=False,
)
dob = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'dob', 'type': 'date', }), required=False,
)
username = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'username', }), required=True,
)
email = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'email', 'type': 'email'}), required=True,
)
password = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'password', 'type': 'password', }), required=True,
)
cfm_password = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'cfm_password', 'type': 'password', }), required=True,
)
class Meta:
model = AuthUserProfile
fields = ('dob',)
def __init__(self, *args, **kwargs):
options = kwargs.get('options') or None
if options is not None:
options = kwargs.pop('options')
super(CreateUserProfileForm, self).__init__(*args, **kwargs)
if options is not None and options.get('exclude_field'):
field_tuples = options.get('exclude_field')
for i in field_tuples:
if self.fields.get(i):
self.fields.pop(i)
if options is not None and options.get('field_attr') is not None:
for i, j in options.get('field_attr').items():
if j.get('attrs') is not None:
attrs = j.get('attrs')
if attrs.get('disabled'):
if self.fields.get(i):
self.fields[i].disabled = attrs.get('disabled')
def clean_username(self):
# print('\n\n\nvalidate username\n\n\n')
username = self.cleaned_data['username']
# print(username)
user_id = self.cleaned_data.get('id')
qs = User.objects.filter(username=username).exclude(id=user_id)
if qs.count() > 0:
raise forms.ValidationError(_("Username has already being used."))
return username
def clean(self):
cleaned_data = self.cleaned_data
password = cleaned_data.get("password")
cfm_password = cleaned_data.get("cfm_password")
# print(password)
# print(cfm_password)
if password != cfm_password:
raise forms.ValidationError(_(
"password and confirm password does not match"
))
Views.py:
# update user
def post(self, request, *args, **kwargs):
# add 'username' to exclude fields
self.opts['exclude_field'] = self.opts['exclude_field']+('username',)
# print(self.opts)
user_profile_instance = User.objects.get(pk=request.POST['user'])
form = CreateUserProfileForm(
request.POST, options=self.opts, instance=user_profile_instance)
if form.is_valid():
createUser = CreateUser()
res = createUser.process_form(request, **{
'form': form
})
if res.get('success') == True:
messages.add_message(request, messages.SUCCESS, res['msg'])
else:
messages.add_message(request, messages.ERROR, res['msg'])
return HttpResponseRedirect(reverse('users:edit-user', kwargs={'id': form.cleaned_data.get('user')}))
# print(form.errors)
# return HttpResponse('form failed')
messages.add_message(request, messages.ERROR, "Something went wrong.")
return render(
request,
'users/create_form.html',
{
'mode': 'EDIT',
'form': form,
}
)
Эта функция ниже process_form()
используется для сохранения и обновления данных пользователя и профиля пользователя
def process_form(self, request, *args, **kwargs):
is_update_opt = False
info = {
'success': False,
'msg': 'Something went wrong.',
'user_obj': {},
}
user_id = kwargs['form'].cleaned_data.get('user') or None
q = {
'first_name': kwargs['form'].cleaned_data.get('first_name'),
'last_name': kwargs['form'].cleaned_data.get('last_name'),
'username': kwargs['form'].cleaned_data.get('username'),
'password': make_password(kwargs['form'].cleaned_data.get('password')),
'email': kwargs['form'].cleaned_data.get('email'),
'is_superuser': 0,
'is_staff': 0,
'is_active': 1,
'date_joined': datetime.now(),
}
if user_id is not None:
pop_list = [
'username', 'password', 'is_superuser', 'is_staff', 'date_joined'
]
for i in pop_list:
q.pop(i)
user_res = User(**q)
if user_id is not None:
is_update_opt = True
user_res = User.objects.filter(pk=user_id).update(**q) #this query is not updating
if user_res > 0:
user_res = User.objects.filter(pk=user_id).first()
else:
user_res.save()
if user_res is not None and user_res.id:
info['user_obj'] = user_res
info['success'] = True
if is_update_opt == True:
info['msg'] = 'Update successfully'
else:
info['msg'] = 'Save successfully'
# user profile model
user_profile = kwargs['form'].save(commit=False)
user_profile.user_id = user_res.id
user_profile.save()
# return HttpResponse(info)
return info
Ниже я загрузил изображение
![output gif image](https://i.stack.imgur.com/3xnfk.gif)
Пожалуйста, предложите мне