Как в Django запретить доступ к определенным полям пользователям?

Есть поля, которые не должны быть видны на форме и на странице для определенных пользователей. Как это можно настроить?

Для этого существуют, так называемые hidden поля. Они используются на форме но невидны на странице. Это относится к вопросу о видимости полей, а не об их отсутствии, для определенных пользователей. Конечно, вы можете настроить права доступа так, чтобы поля были либо hidden, либо нет.

Скрытые поля определяются непосредственно в ORM Django путем установки атрибута Field: editable = False

Например:

class MyModel(models.Model): 
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=32, db_index=True, editable=False) 

Однако, прямая установка или изменение полей модели не всегда возможна или выгодна. В принципе, следующая настройка в admin.py могла бы работать, но не будет работать, поскольку exclude является опцией InlineModelAdmin.

class MyModelAdmin(admin.ModelAdmin): 
exclude = ('name',) 

Если вы хотите сохранить значение в форме (например, установить значение, то есть пользователя, в зависимости от запроса) и скрыть поле, то вы можете изменить виджет на forms.HiddenInput().

class MyModelForm(forms.ModelForm):
    class Init:
        model = MyModel
        fields = ('name', 'ext')
        widgets = {'name': forms.HiddenInput()}

Вернуться на верх