2017-02-20 21 views
0

У меня есть следующие модели:Django-хранители - Установка разрешений для объектов в отношениях на-ко-многим

проекта:

class Project(models.Model): 
    project_name = models.CharField(max_length=100, unique=True) 

SearchCodes:

class SearchCode(models.Model): 
    project = models.ForeignKey(Project, on_delete=models.CASCADE) 
    search_code = models.CharField(max_length=3) 
    search_code_modifier = models.CharField(max_length=1) 

    class Meta: 
    unique_together = ('project', 'search_code', 'search_code_modifier',) 

С Django-Guardian docs Я могу установить разрешения в администраторе Django. Тогда для проекта я могу проверить/ограничить доступ пользователей в представлении следующим образом:

def project_edit(request, pk_project): 

    project = get_object_or_404(Project, pk=pk_project) 
    project_name = project.project_name 

    user = request.user 

    # Check user permission at the object level by passing in this specific project 
    if user.has_perm('myApp.change_project', project): 
     ...do something 

Теперь здесь, где я застрял. Как установить разрешения для ЛЮБЫХ поисковых кодов, связанных с проектом в Django-Admin? Я не хочу устанавливать разрешения на уровне объекта для SearchCodes. Это будет всего лишь каждый экземпляр SearchCode. Скорее мне нужно иметь возможность установить в Admin:

Вы можете просмотреть каждый SearchCode, связанный с этим проектом, но не любые другие SearchCodes.

Пожалуйста, дайте мне знать, если мне нужно быть более конкретным - я попытался сохранить это как можно более общее.

Спасибо - любая помощь или указатели были бы весьма благодарны.

EDIT:

Я использовал Admin-Integration пример для настройки прав доступа на уровне объектов проекта в Django-Guardian.

Похоже, что в этот момент должен быть какой-то способ установить разрешения для всех поисковых кодов, связанных с этим конкретным экземпляром проекта, пока я на странице Object-Permissions для этого проекта.

ответ

1

Django-guardian - это приложение для разрешения на уровне объекта, поэтому назначьте разрешение на объект, который имеет разрешение и проверит этот объект для разрешения. В вашем конкретном примере вам нужно написать что-то подобное, чтобы проверить разрешения для кода через проект (объект переноса разрешений):

def code_edit(request, pk): 

    code = get_object_or_404(SearchCode.objects.select_related('project'), pk=pk) 
    project = code.project 
    project_name = project.project_name 

    user = request.user 

    # Check user permission at the object level by passing in this specific project 
    if user.has_perm('myApp.change_project', project): 
     ...do something 
+0

Благодарим за отзыв. Это очень полезно (+1) для проверки разрешений после их установки, но я ищу указатели/учебник и т. Д. О том, как устанавливать разрешения для SearchCodes в Django-Admin. Хотя, я думаю, я, вероятно, могу использовать эту концепцию и откатывать свои собственные разрешения на уровне SearchCode - я бы предпочел сделать это в админке - ради пользователей и последовательности :) – beginAgain