Django에서 자주 사용하는 웹 응용 프로그램 도구
1. 사용자 정의 권한주어진 모델 객체에 대한 사용자 정의 권한을 만들려면
permissions
모델 메타 속성을 사용합니다.# , Task
class Task(models.Model):
...
class Meta:
permissions = [
("change_task_status", " "),
("close_task", " "),
]
사용자에게 권한이 있는지 확인하려면 다음과 같이 하십시오.
user.has_perm('app.close_task') # has_perm()
추가 사용 권한은 테이블을 볼 수 있습니다
auth_permission
.2. 기존 User 모델 확장
2.1 User 일대일 연결
이와 관련된 정보
User
를 저장하고 싶으면 aOneToOneField
를 사용하여 이 필드를 포함하는 모델에 가서 다른 정보를 얻을 수 있습니다.이러한 일대일 모델을 일반적으로 프로필 모델이라고 하는데, 왜냐하면 사이트 사용자에 대한 비신분 검증과 관련된 정보를 저장할 수 있기 때문이다.예를 들어, Employee 모델을 생성할 수 있습니다.from django.contrib.auth.models import User
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
department = models.CharField(max_length=100)
액세스:
>>> u = User.objects.get(username='fsmith')
>>> freds_department = u.employee.department
관리자의 사용자 페이지에 프로파일 모델 필드를 추가하려면
admin.py
:from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from my_user_profile_app.models import Employee
# Define an inline admin descriptor for Employee model
# which acts a bit like a singleton
class EmployeeInline(admin.StackedInline):
model = Employee
can_delete = False
verbose_name_plural = 'employee'
# Define a new User admin
class UserAdmin(BaseUserAdmin):
inlines = (EmployeeInline,)
# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
2.2 사용자 정의
User
모델 교체만약 네가
auth_user
이 시계 이름을 사용하고 싶지 않다면, 너도 settings
에서 설정할 수 있다.AUTH_USER_MODEL = 'myapp.MyUser'
2.3 프로젝트를 시작할 때 사용자 정의 사용자 모델 사용
새 프로젝트를 시작하려면 기본값
User
모델이 충분하더라도 사용자 정의 사용자 모델을 설정하는 것이 좋습니다.이 모델의 동작은 기본 사용자 모델과 동일하지만 필요하면 나중에 사용자 정의할 수 있습니다.from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
그것을 지적하는 것을 잊지 마라.
AUTH_USER_MODEL
마이그레이션을 생성하거나 처음 실행하기 전에 이 작업을 수행합니다.manage.py migrate
또한 응용 프로그램에 모델을 등록
admin.py
합니다.from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
2.4 사용자 정의 인증
Django의 권한 프레임워크를 사용자 클래스에 포함시키기 위해 Django가 제공했습니다
PermissionsMixin
.이것은 추상적인 모델로 사용자 모델의 클래스 차원 구조에 포함될 수 있으며 Django 권한 모델을 지원하는 데 필요한 모든 방법과 데이터베이스 필드를 제공할 수 있습니다.PermissionsMixin
는 다음과 같은 메서드와 속성을 제공합니다.
.1、
settings.py
AUTH_USER_MODEL = 'crm.UserProfile'
2、
models.py
models에서 사용자 인증을 사용자 정의하고 다음 세 가지 종류를 계승하여 Django가 제공하는 권한 도구, 사용자 인증 등 도구를 사용할 수 있습니다.
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin
)
class UserProfileManager(BaseUserManager):
def create_user(self, email, name, password=None):
""" """
if not email:
raise ValueError(' ')
user = self.model(
email=self.normalize_email(email),
name=name,
)
# (md5+salt)
user.set_password(password)
user.save(using=self._db) #
return user
def create_superuser(self, email, name, password):
""" """
user = self.create_user(
email,
password=password,
name=name,
)
user.is_admin = True
user.save(using=self._db)
return user
class UserProfile(AbstractBaseUser,PermissionsMixin):
email = models.EmailField(
verbose_name=' ',
max_length=255,
unique=True,
)
name = models.CharField(max_length=64)
role = models.ManyToManyField(Role, blank=True, null=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
# ,
objects = UserProfileManager()
USERNAME_FIELD = 'email'
#
REQUIRED_FIELDS = ['name']
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
""" """
return True
def has_module_perms(self, app_label):
" app `app_label`?"
return True
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
@property
def is_staff(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin
3、
admin.py
from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from app01.models import UserProfile
class UserCreationForm(forms.ModelForm):
""" 。 , ."""
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = UserProfile
fields = ('email', 'name')
#
def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(" ")
return password2
def save(self, commit=True):
# Save the provided password in hashed format
# save()
user = super(UserCreationForm, self).save(commit=False)
#
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
class UserChangeForm(forms.ModelForm):
""" 。 , admin's .
"""
#
password = ReadOnlyPasswordHashField()
class Meta:
model = UserProfile
fields = ('email', 'password', 'name', 'is_active', 'is_superuser')
def clean_password(self):
# Regardless of what the user provides, return the initial value.
# This is done here, rather than on the field, because the
# field does not have access to the initial value
return self.initial["password"]
class UserProfileAdmin(BaseUserAdmin):
# The forms to add and change user instances
form = UserChangeForm
add_form = UserCreationForm
# The fields to be used in displaying the User model.
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('email', 'name','is_superuser')
list_filter = ('is_superuser',)
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Personal info', {'fields': ('name',)}),
('Permissions', {'fields': ('is_staff','is_active','role','user_permissions','groups','is_superuser')}),
)
# add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
# overrides get_fieldsets to use this attribute when creating a user.
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'name', 'password1', 'password2')}
),
)
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ('role','user_permissions','groups')
# Now register the new UserProfileAdmin...
admin.site.register(UserProfile, UserProfileAdmin)
# ... and, since we're not using Django's built-in permissions,
# unregister the Group model from admin.
# admin.site.unregister(Group)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.