Django CBV - 根据权限设置表单类?

时间:2018-02-08 14:29:08

标签: python django

我在forms.py中创建了两个表单,一个表单的字段数少于另一个表单。

我现在要做的是获取当前用户的权限,并根据这些权限设置CBV的表单类。

下面是我目前的观点:

class EditCircuit(UpdateView):
    model = Circuits
    # if user_passes_test(lambda u: u.has_perm('config.edit_circuit')))
    form_class = CircuitForm
    # else
    # form_class = CircuitFormRestricted
    template_name = "sites/circuit_form.html"

    @method_decorator(user_passes_test(lambda u: u.has_perm('config.edit_circuit')))
    def dispatch(self, *args, **kwargs):
        self.site_id = self.kwargs['site_id']
        self.site = get_object_or_404(SiteData, pk=self.site_id) 
        return super(EditCircuit, self).dispatch(*args, **kwargs)

    def get_success_url(self, **kwargs):         
        return reverse_lazy("sites:site_detail_circuits", args=(self.site_id,))

    def form_valid(self, form):
        form.instance.site_data = self.object.site_data
        return super(EditCircuit, self).form_valid(form)

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs()
        return kwargs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['SiteID']=self.site_id
        context['SiteName']=self.site.location
        context['FormType']='Edit'
        context['active_circuits']='class="active"'

        return context

2 个答案:

答案 0 :(得分:3)

您可以覆盖get_form_class方法。

def get_form_class(self):
    if self.request.user.has_perm('config.edit_circuit'):
        return CircuitForm
    return CircuitFormRestricted

此外,您似乎不需要get_form_kwargs定义,因为它目前没有做任何事情。

答案 1 :(得分:1)

你可以像这样创建自己的mixin

class AuthorOnlyMixin(object):
    def has_permissions(self):
        return self.get_object().created_by == self.request.user

然后像这样使用它

class EditViewClass(AuthorOnlyMixin, EditView):
    def get_form_class(self):
        if self.has_permissions():
            return FormWithPermission
        else:
            return FormWithoutPermission