零散



django admin的User_model
class profileUser(AbstractBaseUser, PermissionsMixin):
自定义User model 
添加外键的时候是这样添加的
department = models.ForeignKey(Department, default=2, verbose_name='单位名称')
这个需要设置一个字段保持唯一
USERNAME_FIELD = 'userna'

组合唯一
class Meta:
     unique_together = (("username", "department"),)
     db_table='auth_user'            

显示字段名称
verbose_name='单位名称'

定义选择字段
userType = models.CharField(max_length=2,
choices=(
('gl', '管理员'),
('md', '普通用户'),
),default='md', verbose_name='用户类型')

default为默认值
default=False,

显示在后台的表名称
class Meta:
verbose_name ='单位'
verbose_name_plural = verbose_name


关联自身的外键
departFather = models.ForeignKey('self',blank=True,null=True,default=None,verbose_name='上级单位')
字段是默认为self
默认为空blank=True,null=True

设置带小数点的model
lat = models.DecimalField(max_digits=15, decimal_places=8, verbose_name='纬度',blank=True,null=True)

创建字段时间为当前时间
datejoined = models.DateTimeField(default=timezone.now, verbose_name='创建时间')


django连接postgresql数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'Usermodel',
'USER':'postgres',
'PASSWORD':'root',
}
}


url跳转当前app下面的url
urlpatterns = [
url(r'^',include('django_admin.urls')),

urlpatterns = [
url(r'^admin/login/$', login, name='login'),
url(r'^admin/django_admin/department/departFind/$', departFind, name='departFind'),

自定义认证
class CustomBackend(object):
"""
Authenticates against settings.AUTH_USER_MODEL.
"""
#只修改了这个函数
def authenticate(self, username=None, password=None, department=None,**kwargs):
UserModel = get_user_model()
if username is None:
username = kwargs.get(UserModel.USERNAME_FIELD)
try:
user = UserModel.objects.get(Q(username=username) & Q(department__departCode=department))
if user.check_password(password):
return user
except UserModel.DoesNotExist:
# Run the default password hasher once to reduce the timing
# difference between an existing and a non-existing user (#20760).
UserModel().set_password(password)

修改认证form
class AuthenticationForm(forms.Form):
"""
Base class for authenticating users. Extend this to get a form that accepts
username/password logins.
"""
username = forms.CharField(max_length=254)
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
#自定义一个company_form
department = forms.CharField(max_length=254)
将修改的认证form更改到页面当中
# 自定义登录界面
@deprecate_current_app
@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='admin/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
extra_context=None):


django数据库当中的复杂查询
#引入Q进行复杂查询
from django.db.models import Q

登录进的第一个界面是否显示相应连接
def has_module_permission(self, request):

filter的查询结果为一个list
profileUser.objects.filter(id=request.user.id)[0].UserIsSuper:

保存到时候触发事件
def save_model(self, request, obj, form, change):

更改保存的password需要
password=make_password(obj.departCode)

user 
@admin.register(profileUser)
class UserAdmin(admin.ModelAdmin):


可以直接写出外键就可以显示
list_display = ('username', 'first_name', 'last_name', 'department', 'is_staff')

返回需要看到的user
def get_queryset(self, request):
qs = self.model._default_manager.get_queryset()
        if profileUser.objects.filter(id=request.user.id)[0].UserIsSuper:
return qs
else:
return qs.filter(Q(department__departclass__level__gte=request.user.department.departclass.level) & Q(department__company=request.user.department.company))

外键字段过滤
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if not profileUser.objects.filter(id=request.user.id)[0].UserIsSuper:
if db_field.name == "department":
kwargs["queryset"] = Department.objects.filter(Q(departclass__level__gte=request.user.department.departclass.level) & Q(company=request.user.department.company))

return super(UserAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

返回ajax的json请求
return HttpResponse(json.dumps(departList))

可能一些地方需要取消csrf验证
@csrf_exempt

得到请求的数据
company_id = request.POST.get('company_id')
departclass_id = request.POST.get('departclass_id')
spdatas =json.loads(request.POST.get('spdatas'))

查询外键关联字段使用__,条件判断使用__gte等
department_list = Department.objects.filter(Q(departclass__level__gte=request.user.department.departclass.level) & Q(company=request.user.department.company))

返回json格式数据
return HttpResponse(json.dumps(spdatas), content_type="application/json")

取出的数据要先序列化之后在返回
department_list = serializers.serialize('json',department_list)
return render_to_response('sp/create_user.html',{'department_list':json.dumps(department_list),})

django model 数据库连接查询
profileUser.objects.create()
Department.objects.filter()
Company.objects.all()



自定义django的admin界面

可以通过判断路径来控制页面
{% if '/admin/django_admin/department/add/' in request.path %}
<a href="/admin/django_admin/department/add/createDepartment/">
<button style="height: 30px">批量创建单位</button>
</a>
{% endif %}




django加载静态文件
<script type="text/javascript" src={% static "js/jquery.min.js" %}></script>

django 取消密码验证
在setttings里面进行设置
# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators

# AUTH_PASSWORD_VALIDATORS = [
# {
# 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
# },
# {
# 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
# },
# {
# 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
# },
# {
# 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
# },
# ]








原文地址:https://www.cnblogs.com/wuqingzangyue/p/5749701.html