Я создаю простое веб-приложение и не могу найти способа запретить другим пользователям изменять ваш пароль. Это минимальный код:
# serializers.py
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
# have to use custom create method because default method calls `User.objects.create()` which doesn't take care of password hashing and other important stuff
return User.objects.create_user(**validated_data)
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
read_only_fields = ('id', 'username')
# password is set to write_only because I don't want to send it to anybode (even though it's just a hash)
extra_kwargs = {'password': {'write_only': True}}
# views.py
from .serializers import UserSerializer
from rest_framework import generics
from django.contrib.auth.models import User
class UserDetails(generics.RetrieveUpdateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
Я мог бы сам позаботиться об этом, используя APIView
.
# views.py
from .serializers import UserSerializer
from rest_framework.views import APIView
from django.contrib.auth.models import User
class UserDetails(APIView):
def put(self, request, format=None):
serialized = UserSerializer(data=request.DATA)
if not serialized.is_valid():
return # probably HTTP 400 Error code
if request.user.id != serialized.data['id']:
# this if is what I'm trying to achieve
return # probably HTTP 403 Error code
user = User.objects.update(
id=serialized.data['id'],
email=serialized.data['email']
)
if 'password' in request.DATA:
user.set_password(request.DATA['password'])
return # probably HTTP 200 Error code
К сожалению, это привело бы к тому, что сгенерированная rest_framework.schemas.get_schema_view
схема была бы неполной. И я использую для связи CoreAPI (который не может общаться с чем-то, что не описано в схеме), поэтому я не могу этого сделать. Я не нашел ничего в официальной документации.
Кажется, это слишком простая проблема, решение которой очень просто пропущено. Спасибо за любые идеи или места, где искать.
PS: я использую django2.1 с python3.6
Редактировать: решения osobacho чисты и работают как шарм. В любом случае, мне также нужно разрешить модификации (скажем, TODO-list) только создателю этого списка задач. Думал, что решение проблемы с паролем будет применимо, но это не так.