zigen
@zigen

Как в Django ограничить видимость полей экземпляра модели?

Добрый день.
Довольно не типичная задача для Django мне кажется.

Есть модель User и допустить модель данных поставки Supply

class Supply(model.Model):
    name = models.CharField(...)
    field1 = models.CharField(...)
    field2 = models.CharField(...)
    field3 = models.CharField(...)


Нужно сделать в админке интерфейс для ограничивания видимости какого либо поля определенной поставки для конкретного юзера.
Мне пришло в голову создать промежуточную модель в которой указывать конкретного пользователя, поставку и поля которые он не должен увидеть(по-умолчанию видит всё):

class IntermediateTable(models.Model):
    user = models.ForeignKey(User)
    supply = models.ForeignKey(Supply)
    access = models.ManyToManyField(Choices, null=True, blank=True)


В чойсес добавить названия полей модели Supply.

class Choices(models.Model):
  description = models.CharField(max_length=300)


Затем фильтровать кверисет во вью. Чую адский хардкод, подскажите более изящное решение
  • Вопрос задан
  • 682 просмотра
Пригласить эксперта
Ответы на вопрос 2
@ATNC
Full-stack web\python developer
Можно попробовать в admin.py переопределить метод get_form и при инициализации формы сделать там проверку на юзера, например:
class SupplyAdmin(admin.ModelAdmin):
   available_fields = ('name', 'field1', 'field2')
   hidden_fields = ('field3',)
   def get_form(self, request, obj, **kwargs):                             
       if request.user.username == 'example@example.com':                                            
           self.fields = self.available_fields + self.hidden_fields         
       else:                                                                    
           self.fields = self.available_fields

        return super(SupplyAdmin, self).get_form(request, obj, **kwargs)
Ответ написан
Можно так попробовать:
models.py
class Choices(models.Model):
    description = models.CharField(max_length=300)
    users = models.ManyToManyField(User)


views.py
def some_view(request):
    list = [item for item in Choices.objects.all() if request.user in item.users.all() ]
    return render(request, 'template.html', locals() )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы