Django:如果用户是员工,如何排除表单字段?

Ham*_*mza 7 forms django

如果用户不是员工,如何排除表单字段?我尝试了这个但是没有用,给出了一个错误:

global name 'user' is not defined

class PostForm(ModelForm):

    class Meta:
        model = Photo
        exclude = ['author','featured','published']

    def __init__(self, *args, **kwargs):
        published = kwargs.pop('published', None)
        super(PostForm, self).__init__(*args, **kwargs)
        if not user.is_staff:
           del self.fields['published']
Run Code Online (Sandbox Code Playgroud)

view.py

def addpost(request):

    if request.method == 'POST': 
        form = PostForm(request.POST,request.FILES,user=request.user) 
        if form.is_valid():

            post = form.save(False)
            post.author = request.user
            form.save()

            return HttpResponseRedirect(reverse('insight.content.views.index', ))

    else:
        form = PostForm(user=request.user)


    ispost = True
    return render_to_response('form_add_place.html', {'form': form,'ispost':ispost},context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

小智 15

这可以在渲染表单时在模板中实现.它需要允许空值或在模型定义中具有默认值,或者覆盖其验证:

<form method="post">{% csrf_token %}
    {% if request.user.is_staff %}
    <p>{{ form.published }}</p>
    {% endif %}

    <p>{{ form.author }}</p>

    <!-- ... your other fields -->
</form>
Run Code Online (Sandbox Code Playgroud)

同样,您可以检查is_superuser或检查权限,请参阅文档:https://docs.djangoproject.com/en/dev/topics/auth/default/#permissions


Bur*_*lid 4

您需要将请求中的用户实例传递给它 - 模型表单无权访问它。

my_form = PostForm(user=request.user)

然后,在你的__init__

def __init__(self, *args, **kwargs):
    published = kwargs.pop('published', None)
    user = kwargs.pop('user', None)
    super(PostForm, self).__init__(*args, **kwargs)
    if not user.is_staff:
       del self.fields['published']
Run Code Online (Sandbox Code Playgroud)