Просмотр или редактирование своего профиля, который в данный момент находится под логином
Я редактирую профиль, используя фреймворк Django. Проблема заключается в том, что пользователь, вошедший в систему, может видеть профиль другого пользователя, когда он меняет id в веб-адресе. Не мог бы кто-нибудь помочь мне, чтобы я мог просматривать профиль только того пользователя, который вошел в систему, а если он изменит id, то получит ошибку. Спасибо
Редактировать профиль пользователя
@login_required(login_url = 'signin')
@user_passes_test(check_role_super)
def sa_profile_edit(request, user_id=None):
user = get_object_or_404(User, pk=user_id)
user_profile = get_object_or_404(userMember, pk=user_id)
if request.method == 'POST':
form = UserFormAdmin(request.POST or None, instance=user)
form_profile = MemberForm(request.POST or None, instance=user_profile)
else:
form = UserFormAdmin(instance=user)
form_profile = MemberForm(instance=user_profile)
context = {
'form': form,
'user': user,
'form_profile': form_profile,
'user_profile': user_profile
}
return render(request, 'pages/sa_editProfile.html', context)
Если роль супер
def check_role_super(user):
if user.role == 3:
return True
else:
raise PermissionDenied
Модель
Вместо этого вы можете получить текущего пользователя из запроса, замените user = get_object_or_404(User, pk=user_id)
на:
user = request.user
if not user.is_authenticated:
raise Http404()
========= view.py ===========
# User Profile Update
def ProfileView(request):
if request.user.is_authenticated:
form =UserProfileChangeForm(instance=request.user)
context = {'form':form}
if request.method == 'POST':
form =UserProfileChangeForm(request.POST,instance=request.user)
if form.is_valid():
form.save()
messages.info(request,'Profile Successfully Updated')
return redirect('/profile/')
else:
form =UserProfileChangeForm(instance=request.user)
user_data = request.user
context = {'form':form,'user_data':user_data}
return rend
er(request,'profile.html',context)
======= form.py ========
from django.contrib.auth.forms import UserChangeForm
# User Profile
class UserProfileChangeForm(UserChangeForm):
password =None
class Meta:
model = User
fields = ['username','first_name','last_name','email']
widgets = {
'username':forms.TextInput(attrs={'class':'form-control','placeholder':'Enter Username'}),
'first_name':forms.TextInput(attrs={'class':'form-control','placeholder':'Enter First Name'}),
'last_name':forms.TextInput(attrs={'class':'form-control','placeholder':'Enter Last Name'}),
'email':forms.TextInput(attrs={'class':'form-control','placeholder':'Enter E-Mail'}),
}
вы должны реализовать класс с концепцией UUID
. UUID предназначен для защиты url адреса.
но как короткое и не идеальное решение
вы можете перезаписать id в вашем коде с помощью request.user.id
.
Допустим, у вошедшего пользователя id=3
и он попытается изменить его на id=4
и тогда будет вызвана функция view. Но вы можете перезаписать этот id, как я сказал выше, и в итоге он все равно увидит свой профиль. Но URL будет отображать неправильный id
, так что это не лучший вариант.