代码之家  ›  专栏  ›  技术社区  ›  John Debs

Django管理员的具体用例

  •  2
  • John Debs  · 技术社区  · 16 年前

    我有几个Django管理的特殊用例,我很好奇其他人的意见:

    1. 我想使用一个定制版本的管理员,允许用户编辑网站上的某些对象(定制后看起来更像网站的其他部分)。此时,用户只能编辑他们拥有的对象,但我最终会将其打开为更维基风格的东西,任何用户都可以编辑任何对象。换句话说,我会将所有用户指定为“员工”,并授予他们编辑这些对象的权限。

    2. 我也在考虑对其他对象这样做,因为并非所有用户都能编辑所有对象。我会使用自定义视图来确保用户只编辑自己的对象。好处是,我将有一个编辑界面的起点(因为管理员会自动创建它),我可以用ModelAdmin进行自定义,因为管理员功能已经非常接近我想要的了。

    我觉得第一个建议可以接受,而第二个建议可能不可以。在查看了其他一些资源后( Valid use case for django admin?

    3 回复  |  直到 9 年前
        1
  •  4
  •   Wladimir Palant    14 年前

    你可以自由地做任何你想做的事。如果你想自定义Django管理员,那就去吧,但一旦你偏离了典型的管理员修改路径,你可能就不会得到邮件列表和IRC的很好支持。

    generic create/edit/delete generic details/list 视图——它们将非常快速地公开您所需的基本功能,并且比管理员更容易扩展。

        2
  •  2
  •   michael    16 年前

    我之前已经让django应用程序在不修改实际管理代码的情况下做到了这一点。而是通过创建admin的子类。ModelAdmin的几个方法都扩展了查询集过滤器。这将仅显示用户拥有的记录(在这种情况下,业务是AUTH_PROFILE_MODEL)。网络上有各种各样的博客,介绍如何实现这一目标。

    您可以使用此技术筛选列表、表单选择框、表单字段验证保存等。

    到目前为止,它已经从NFA存活到1.0到1.1,但这种方法很容易受到api变化的影响。

    在实践中,我发现为应用程序中的新模型生成新的行级访问级别管理表单要快得多,因为我已经添加了它们。您只需使用用户fk创建一个新模型,子类化AdminFilterByBusiness,或者

    admin.site.register(NewModel,AdminFilterByBusiness)
    

    如果它不需要任何定制。它工作,非常干燥。

    下面的示例过滤器管理类灵感来自 http://code.djangoproject.co/wiki/NewformsHOWTO

    #AdminFilterByBusiness {{{2
    class AdminFilterByBusiness(admin.ModelAdmin):
        """
        Used By News Items to show only objects a business user is related to
        """
        def has_change_permission(self,request,obj=None):
            self.request = request
    
            if request.user.is_superuser:
                return True
    
            if obj == None:
                return  super(AdminFilterByBusiness,self).has_change_permission(request,obj)
    
            if obj.business.user == request.user:
                return True
            return False
    
        def has_delete_permission(self,request,obj=None):
    
            self.request = request
    
            if request.user.is_superuser:
                return True
    
            if obj == None:
                return  super(AdminFilterByBusiness,self).has_delete_permission(request,obj)
    
            if obj.business.user == request.user:
                return True
            return False
    
        def has_add_permission(self, request):
    
            self.request = request
            return super(AdminFilterByBusiness,self).has_add_permission(request)
    
        def queryset(self, request):
            # get the default queryset, pre-filter
            qs = super(AdminFilterByBusiness, self).queryset(request)
            #
            if not (request.user.is_superuser):
                # filter only shows blogs mapped to currently logged-in user
                try:
                    qs = qs.filter(business=request.user.business_set.all()[0])
                except:
                    raise ValueError('Operator has not been created. Please Contact Admins')
            return qs
    
        def formfield_for_dbfield(self, db_field, **kwargs):
    
            """ Fix drop down lists to populate as per user request """
            #regular return for superuser
            if self.request.user.is_superuser:
                return  super(AdminFilterByBusiness, self).formfield_for_dbfield(
                        db_field, **kwargs)
    
            if db_field.name == "business":
                return forms.ModelChoiceField(
                    queryset = self.request.user.business_set.all()
                   )
    
            #default
            return  super(AdminFilterByBusiness, self).formfield_for_dbfield(db_field, **kwargs)
    
        3
  •  1
  •   S.Lott    16 年前

    Django更新事务的编写非常简单,尝试自定义管理员似乎比编写事务本身更费力。

    我们的交易并不比表中显示的复杂多少 http://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-in-a-view .

    通常,我们的有事务的页面几乎总是包含工作流元素(或相关内容),这使得它们比内置的管理界面稍微复杂一些。除了样板之外,我们还有六行左右的额外代码。

    我们的用例不是简单的添加/更改/删除,因此我们需要比默认管理应用程序提供的更多功能。