2012-06-05 7 views
0

У меня есть приложение Django и есть два приложения в проекте: учетные записи и хранилище. В моем приложении для магазина у меня есть модель продукта, категория и другие модели.Сайт администратора Django для пользователей с ограниченными правами

У меня есть сайт администратора, откуда я могу зарегистрировать продукты. В учетных записях я разрешаю общим людям регистрироваться и регистрироваться.

Теперь я также хочу, чтобы пользователи могли регистрировать Продукты, чтобы они могли продавать свои собственные продукты. Однако я не хочу предоставлять им полный доступ к сайту администратора.

Как я могу предоставить ограниченный доступ к сайту администратора для обычных пользователей?

Спасибо.

+3

Администратор не предназначен для замены вашего собственного сайта; есть причина, по которой флаг, управляющий логином администратора, называется ** is_staff **. –

+0

ВЫ МОЖЕТЕ УСТАНОВИТЬ РАЗРЕШЕНИЯ ДЛЯ ПОЛЬЗОВАТЕЛЕЙ В АДМИНИСТЕ СВОБОДНЫМ ПОЛЬЗОВАТЕЛЕМ КАК СУПЕР ПОЛЬЗОВАТЕЛЯ –

+2

Не делайте этого. Потратьте время, чтобы создать интерфейс для своих пользователей. Администратор не является и никогда не будет предназначен для общих действий пользователя. –

ответ

1

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

класса Company (models.Model):

name = models.CharField(max_length=64, primary_key=True) 
kam = models.ForeignKey(User, verbose_name='KAM', blank=True, null=True) 
address = models.TextField(blank=True, null=True) 
city = models.CharField(max_length=32, blank=True, null=True) 
country = models.CharField(max_length=32, blank=True, null=True) 
phone = models.CharField(max_length=32, blank=True, null=True) 
fax = models.CharField(max_length=32, blank=True, null=True) 
url = models.URLField(blank=True, null=True) 


class Meta: 
    verbose_name_plural = 'Companies' 
    #unique_together = (('name', 'kam'),). 

def __unicode__(self): 
    return self.name 

Теперь ваша модель будет связана с пользователем, теперь можно ограничить записи, которые будут загружены в соответствии с вошедшего пользователя, используя admin.py в определении modeladmin как приведено ниже:

def queryset(self, request): 
    qs = super(CompanyAdmin, self).queryset(request) 
    # If super-user, show all comments 
    if request.user.is_superuser: 
     return qs 
    return qs.filter(kam=request.user) 

то будет просто дайте мне знать, если это то, что вы хотите?

Также вы можете назначить право на чтение только справа. в модели admin

1

Администратор использует класс ModelAdmin, чтобы отобразить страницу, как вы, вероятно, уже знаете. У этого класса есть метод queryset, который вы переопределяете на основе нового фильтра, основываясь на том, кто обращается к сайту, как это было предложено sharafjaffri.

Но этой фильтрации недостаточно. Вам также необходимо отфильтровать значения, отображаемые в раскрывающихся списках, только для тех, которые созданы пользователем. А затем, когда вы сохраняете, вы должны связать новый объект с порталом пользователя, добавляющего его.

Вот моя быстрая непроверенная реализация того же:

class PortalAdmin(admin.ModelAdmin): 

    exclude = ('portal',) 

    def queryset(self, request): 
     """ 
     Filter the objects displayed in the change_list to only 
     display those for the currently signed in user. 
     """ 
     qs = super(UserAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     else: 
      return qs.filter(portal=request.user.profile.portal) 

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 
     the_model = db_field.related.parent_model 

     if hasattr(the_model,'portal'): 
      kwargs['queryset'] = the_model.objects.filter(portal=request.portal) 
     return super(PortalAdmin,self).formfield_for_foreignkey(db_field, request, **kwargs) 

    def save_model(self, request, obj, form, change): 
     if not change: 
      obj.portal = request.portal 
     obj.save() 
Смежные вопросы