Доступ к редактированию профиля только владельцем профиля с помощью UserPassesTestMixin показывает ошибку?

#django #django-models #django-views #django-templates #django-permissions

#django #django-модели #django-просмотры #django-шаблоны #django-разрешения

Вопрос:

мне удалось создать страницы профиля для каждого пользователя, и каждый пользователь должен редактировать свой собственный профиль. в модели я использовал модель AbstractUser. и для доступа к редактированию я импортировал UserPassesTestMixin.

вот мой models.py:

 class Profile(AbstractUser):
    
    name=models.CharField(max_length=30, blank=True)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birthdate = models.DateField(null=True, blank=True)
 

вот мой views.py:

 class ProfileDetailView(DetailView):
    template_name='profile.html'
    model=Profile
    def get_user_profile(self,pk):
        return get_object_or_404(Profile,pk=pk)
    

class ProfileEditView(LoginRequiredMixin,UserPassesTestMixin,UpdateView):
    model=Profile
    template_name='profile_edit.html'
    fields=['name','bio','birthdate','location','gender',]
    login_url='login'
    success_url = reverse_lazy('home')
    def get_user_profile_edit(self,pk):
        return get_object_or_404(Profile,pk=pk)

    def test_func(self):
        obj = self.get_object()
        return obj.username == self.request.user

    
 

проблема в том, что когда вошедший в систему пользователь хочет отредактировать свой профиль, он показывает 403 запрещено. ни один пользователь не может редактировать свой профиль. что следует использовать в тестовой функции, чтобы исправить это?

Ответ №1:

Поскольку Profile это модель пользователя, это означает, что obj должно быть request.user :

 class ProfileEditView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model=Profile
    template_name='profile_edit.html'
    fields=['name','bio','birthdate','location','gender',]
    login_url='login'
    success_url = reverse_lazy('home')
    
    def get_user_profile_edit(self,pk):
        return get_object_or_404(Profile,pk=pk)

    def test_func(self):
        return self.get_object() == self.request.user 

Однако вам это не нужно, вы можете просто использовать request.user как сам объект:

 class ProfileEditView(LoginRequiredMixin, UpdateView):
    model=Profile
    template_name='profile_edit.html'
    fields=['name','bio','birthdate','location','gender',]
    login_url='login'
    success_url = reverse_lazy('home')
    
    def get_object(self, *args, **kwargs):
        return self.request.user 

В этом случае просмотру не нужен первичный ключ, поскольку люди, которые посещают просмотр, просто увидят свой собственный профиль для редактирования.