#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
В этом случае просмотру не нужен первичный ключ, поскольку люди, которые посещают просмотр, просто увидят свой собственный профиль для редактирования.