Take the current admin

Viewed 55

serializers.py

class RegSerializer(serializers.ModelSerializer):
    admin = serializers.SlugRelatedField(slug_field='username', read_only=True)
    class Meta:
        model = Registration
        fields = [
        'id', 'rooms', 'first_name', 'last_name','admin', 'pasport_serial_num', 'birth_date', 'img', 'visit_date',
        'leave_date', 'guest_count', 'room_bool']

models.py

class Rooms(models.Model):
    objects = None
    room_num = models.IntegerField(verbose_name='Комната')
    room_bool = models.BooleanField(default=True, verbose_name='Релевантность')
    category = models.CharField(max_length=150, verbose_name='Категория')
    price = models.IntegerField(verbose_name='Цена (сум)', null=True)
    def __str__(self):
        return f'{self.room_num}'

    class Meta:
        verbose_name = 'Комнату'
        verbose_name_plural = 'Комнаты'


class Registration(models.Model):
    objects = None
    rooms = models.ForeignKey(Rooms, on_delete=models.CASCADE, verbose_name='Номер',
                              help_text='Номер в который хотите заселить гостя!',
                         )
    first_name = models.CharField(max_length=150, verbose_name='Имя')
    last_name = models.CharField(max_length=150, verbose_name='Фамилия')
    admin = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Администратор')
    pasport_serial_num = models.CharField(max_length=100, verbose_name='Серия паспорта', help_text='*AB-0123456')
    birth_date = models.DateField(verbose_name='Дата рождения')
    img = models.FileField(verbose_name='Фото документа', help_text='Загружайте файл в формате .pdf')
    visit_date = models.DateField(
        default=django.utils.timezone.localdate, verbose_name='Дата прибытия')
    leave_date = models.DateField(blank=True, null=True, verbose_name='Дата отбытия', default='После ухода!')
    guest_count = models.IntegerField(default=1, verbose_name='Кол-во людей')
    room_bool = models.BooleanField(default=False, verbose_name='Релевантность',
                                    help_text='При бронирование отключите галочку')
    price = models.IntegerField(verbose_name='Цена (сум)', null=True)

    def __str__(self):
        return f'{self.rooms},{self.last_name},{self.first_name},{self.room_bool}'

    class Meta:
        verbose_name = 'Номер'
        verbose_name_plural = 'Регистрация'

how can I make it so that the name of the user who registered room is indicated in the admin field and without the right to change only readonly?

can this be done at all? thanks in advance for your reply

2 Answers

You can pass additional attributes to serilizer's save method. In your view, you can call serializer save() with admin argument like this:

def your_view(request):
    # your code
    serializer.save(admin=request.user)

Or if you want to do it on admin page, you can override your admin's save_model method. Also you should specify admin as a readonly:

class RegistrationAdmin(admin.ModelAdmin):
    readonly_fields = ('admin',)

    def save_model(self, request, obj, form, change):
        if not obj.pk:
            # Only set admin during the first save.
            obj.admin = request.user
        super().save_model(request, obj, form, change)

I set serializers.HiddenField and by default set CurrentUserDefault() from serializers automatically substitutes the value of the current admin and at the same time the admin field now goes to the api

class RegSerializer(serializers.ModelSerializer):
    admin = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = Registration
        exclude = ['price', 'visit_date']
Related