django ModelForm中的外鍵字段值過濾的實現

1. Model

class user_list(models.Model):
    user_name=models.CharField(unique=True, max_length=40)
    full_name=models.CharField(unique=True, max_length=40)
    email_address=models.CharField(max_length=40)
    dept_list=models.ForeignKey('dept_list', on_delete=None, to_field='id', )
    regdate=models.DateField(auto_now=True)
    resigndate=models.DateField(blank=True)
    lastupdate = models.DateField(blank=True)
    user_status=models.CharField(max_length=40, default='active')
    remark = models.CharField(max_length=40, default='--')
    class Meta:
        ordering = ('full_name',)
    def __str__(self):
         return self.full_name
class dept_list(models.Model):
    bl_list = models.ForeignKey('bl_list',to_field='id',on_delete=None,default=2)
    dept_name = models.CharField(max_length=45)
    dept_leader = models.CharField(max_length=45)
    def __str__(self):
        return self.dept_name

 

 

2.ModelForm

class UserModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs, ):
#這裏從**kwargs 中pop出實例傳入的request
        self.request = kwargs.pop("request")
#這裏從實例傳入request中的user的officename
        officename = self.request.user.adm_info.site.officename
        super(UserModelForm, self).__init__(*args, **kwargs, )
 #這裏要從參加數dict中判斷是否是實例,在視圖中post   
        if 'instance' in kwargs.keys():
            print(kwargs['instance'])
       #禁止在前端頁面中修改user_name的值
            self.fields['user_name'].disabled = True

      
#從dept_list model中返回記錄初始的dept_name和滿足條件(dept_name中包含officename)的記錄,一般是用在改用戶的記錄
            self.fields['dept_list'].queryset = dept_list.objects.filter(
            Q(dept_name=self.instance.dept_list) | Q(dept_name__icontains=officename))
#如果在視中是GET,運行下面,新建用戶的時候使用
        else:
            self.fields['dept_list'].queryset = dept_list.objects.filter(dept_name__icontains=officename)

 

3. views

@csrf_exempt
@login_required(login_url='/account/login')
def useredit(request, id):

    userobj = user_list.objects.get(id=id)
    if request.method == 'GET':
#這裏的request 是向ModelForm傳入request.user
        obj = UserModelForm(instance=userobj, request=request)

    if request.method == 'POST':
#這裏的request 是向ModelForm傳入request.user
        obj = UserModelForm(request.POST, instance=userobj,request=request)  #
        print(obj.is_valid())  # 這是方法,別忘記了加括號
        print(obj.cleaned_data)
       
        print(obj.errors)
        if obj.is_valid():
            #dept_name=
            #print(obj.cleaned_data.get('dept_name'))

            obj.save()
            messages.info(request,obj.data.get('full_name') +'保存成功!')
            return HttpResponseRedirect('/deviceman/display_user')
        else:
            print(obj.errors.as_json())
    return render(request, "useredit.html", {'obj': obj, 'acton': 'useredit', 'modelname': '-編輯user', 'id': id})

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章