问题2:客户的添加页面,通过popup创建用户时
解决方案:
如果新创建的用户时:如果是销售部的人,页面才增加
目的是:拿到limit_choices_to,就可以判断了
当有两个Foreignkey的时候,都关联同一张表,反向生成的时候
不知道去找那个字段了,得加上releated_name
1、创建表
from django.db import models
# Create your models here.
class UserInfo(models.Model):
user_type_choices = (
(1,"班主任"),
(2,"讲师")
)
user_type_id = models.IntegerField(choices=user_type_choices)
name = models.CharField(max_length=32,verbose_name="姓名")
pwd = models.CharField(max_length=32,verbose_name="密码")
class ClassList(models.Model):
teacher = models.ForeignKey(to="UserInfo",to_field="id",limit_choices_to={"user_type_id":1},related_name="toclasslist") ## user_obj.tclasslist.all()
classteacher = models.ForeignKey(to="UserInfo",to_field="id",limit_choices_to={"user_type_id":2}) #没有related_name默认是None #user_obj.classlist_set.all()
class Test(models.Model):
title = models.CharField(max_length=32)
teacher = models.ForeignKey(to="UserInfo",to_field="id",limit_choices_to={"user_type_id":3}) #注意limit_choices_to的key必须要和上面的对应上
2、urls
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/',views.test),
url(r'^index/',views.index),
url(r'^condition/',views.condition),
]
3、views
from django.db.models import Q
from django.shortcuts import render,HttpResponse
from django.forms import ModelForm
from app01 import models
# Create your views here.
class UserInfoForm(ModelForm):
class Meta:
model = models.UserInfo
fields = "__all__"
class ClassListForm(ModelForm):
class Meta:
model = models.ClassList
fields = "__all__"
def condition(request):
'''测试Q查询'''
key_word = request.GET.get("q")
# print(key_word)
search_fileds = ['name', 'email'] # 拿到搜索字段
condition = Q()
condition.connector = "or"
if key_word and True:
for fields_name in search_fileds:
condition.children.append((fields_name, key_word))
print(condition)
return HttpResponse("ok")
def test(request):
mn = request.GET.get("model_name")
rn = request.GET.get("related_name")
from django.db.models.fields.reverse_related import ManyToOneRel
# 1、创建用户(自己创建的用户和利用ModelForm,form.save()创建的一样))
# form = UserInfoForm(request.POST)
# obj = form.save()
obj = models.UserInfo.objects.create(user_type_id=1,name="hiana",pwd=123456)
# 2、判断用户的类型是否可以放置到班主任的下拉框
#获取obj对象可反向关联的所有的字段
#关联字段所在类的名称等
# print(obj._meta.related_objects) #(<ManyToOneRel: app01.classlist>, <ManyToOneRel: app01.classlist>, <ManyToOneRel: app01.test>)
for related_object in obj._meta.related_objects:
# print(related_object.related_name) #打印的是反向查询的related_name,结果是:toclasslist,None,None
# print(related_object.field,"1") #app01.ClassList.teacher 关联的那个字段的名字
# print(related_object.field.model,"2") #<class 'app01.models.ClassList'> 关联的字段所在的类
# print(related_object.field.model._meta.model_name,"3") #classlist 关联字段所在的类名
model_name = related_object.field.model._meta.model_name
related_name =related_object.related_name
if type(related_object) ==ManyToOneRel:
to_field_value = related_object.field_name #那到的是反向查询关联字段(to_fields)的值 id
limit_choices_to = related_object.limit_choices_to #拿到的是limit_choices_to的值{'user_type_id': 2}
if model_name==mn and str(related_name)==rn:
print(to_field_value,limit_choices_to)
models.UserInfo.objects.filter(**limit_choices_to,pk=obj.pk)
# models.UserInfo.objects.filter(**{"user_type_id":2},pk=obj.pk)
return HttpResponse("ok")
def index(request):
form = ClassListForm()
return render(request,"index.html",{"form":form})
4、templates
index.html
<body>
{{ form.as_p }}
</body>