Просмотр или редактирование своего профиля, который в данный момент находится под логином

Я редактирую профиль, используя фреймворк 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, так что это не лучший вариант.

Вернуться на верх