Search code examples
pythondjangodjango-modelsdjango-rest-frameworkdjango-serializer

Take the current admin


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


Solution

  • 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)