无法更改user.is_staff的值

时间:2016-06-21 14:57:42

标签: python django

我在项目中创建了自定义Staff模型和ModelForm。默认情况下,创建一个没有工作人员权限的人员。在另一个世界中,User.is_staff = False。可以稍后在updatstaff中设置权限。在我的updatestaff中,我尝试通过调用user.is_staff = True来提供员工权限。但是,user.is_staff总是默认值(False),并且根本没有任何变化。有人可以告诉我问题是什么吗?

In views.py

def updatestaff(request,id=None):

    instance = get_object_or_404(Staff,id=id)
    if request.POST:
        staff_form = StaffForm(request.POST or None,instance=instance)
        if staff_form.is_valid():

            old_user = User.objects.get(username= request.POST.get('name'))

            if request.POST.get('authorized'):
                old_user.is_staff = True
            else:
                old_user.is_staff = False
            old_user.save()
            staff_form.save()
            return HttpResponseRedirect('/dataInfo/staff_view/')
    else:
        staff_form = StaffForm(instance=instance)
    return render_to_response('dataInfo/update_staff.html', {'form': staff_form,'id':instance.id}, context_instance=RequestContext(request))


In models.py

  class Staff(models.Model):
    yes_or_no = ((True, 'Yes'),(False, 'No'))
    male_or_female = ((True,'Male'),(False,'Female'))

    name = models.CharField(max_length=100,blank = False, null = False)
    email = models.EmailField(max_length=100,blank = False, null = False)
    password = models.CharField(max_length=100,blank = False, null = False)
    gender = models.BooleanField(default = True, choices = male_or_female)
    birthday = models.DateField(default =None,blank = False, null = False)
    created = models.DateTimeField(default=datetime.now, blank=True)
    authorized = models.BooleanField(default=False,choices = yes_or_no) 
    store_id = models.ForeignKey(Store,default=1) 

In forms.py

class StaffForm(forms.ModelForm):

store_id = forms.ModelChoiceField(queryset = Store.objects.all(),empty_label="--------") # select values ?
class Meta:
    model = Staff
    fields = ('name','email','password','gender','birthday','authorized','store_id')
    widgets = {'authorized':forms.RadioSelect,
               'gender':forms.RadioSelect,
                'birthday':SelectDateWidget(years=range(date.today().year-50,date.today().year))
    }

2 个答案:

答案 0 :(得分:1)

您永远不应该认为<console>:12: error: type mismatch; found : Int(1) required: String println((q+1).toString) 可以为您提供正确的数据类型。你得到的是request.POST.get(...)。因此,unicodebool('True')True也为bool('False')。在您的情况下,它始终是True。不清楚为什么True无法更新为old_user.is_staff。您现在可以尝试的是在True之后致电old_user.save()

staff_form.save()

答案 1 :(得分:0)

@ trantu的回答解释了您的代码存在的问题,但是您永远不应该通过检查POST参数来检查用户是否获得授权,因为用户可以使用表单发布他们想要的任何内容。

你应该使用这样的东西:

if request.user.is_staff():  # Or admin, or checking the permissions of the user.