2016-06-21 3 views
0

Я создаю пользовательскую модель персонала и ModelForm в моем проекте. По умолчанию A Staff создается без разрешения персонала. В другом мире User.is_staff = False. Разрешение можно установить позже в updatstaff. В моем updatestaff я пытаюсь предоставить разрешение на работу с помощью user.is_staff = True. Однако user.is_staff всегда имеет значение по умолчанию (False), и ничего не меняется вообще. Может кто-нибудь сказать мне, в чем проблема?Невозможно изменить значение user.is_staff

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)) 
    } 
+0

Когда вы делаете 'old_user.save()' и 'staff_form.save()', 'делает ваш staff_form' возможно перезаписать ранее сохраненный' old_user 'с обновленным значением' is_staff'? Потому что в вашем вопросе вы опубликовали 'SaleForm', который полностью не связан с вашим вопросом, но вы не опубликовали« StaffForm ». – C14L

+0

извините, внесите неправильный код – pipi

ответ

1

Вы не должны полагать, что request.POST.get(...) может предоставить вам подходящий тип данных. То, что вы получаете, это unicode. Таким образом, bool('True') является True и bool('False') также является True. В вашем случае это всегда будет True. Неясно, почему old_user.is_staff не может быть обновлен до True. То, что вы могли бы попробовать прямо сейчас истите, что вы называете old_user.save() после staff_form.save():

 if request.POST.get('authorized')=='True': 
      old_user.is_staff = True 
     else: 
      old_user.is_staff = False 

     staff_form.save() 
     old_user.save() 
0

@ ответа trantu объясняет проблему с вашим кодом, но вы никогда не должны проверить, если пользователь авторизован путем проверки параметров POST, как пользователь может отправляйте все, что захотите, с помощью формы.

Вы должны использовать что-то вроде этого, вместо:

if request.user.is_staff(): # Or admin, or checking the permissions of the user. 
Смежные вопросы