django ModelForm中的外來鍵欄位值過濾的實現
阿新 • • 發佈:2018-12-12
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})