### django自带的admin系统:
1. 如何开启admin系统:
>1. 在使用admin之前,要确保安装了一些东西。
* 确保在`settings.py`中的`INSTALLED_APPS`安装了`'django.contrib.admin'`
* 在`INSTALLED_APPS`中添加了四个依赖的`app`,`django.contrib.auth`,`django.contrib.contenttypes`,`django.contrib.messages`和`django.contrib.sessions`。
* 在模板上下文中添加以下依赖`django.contrib.auth.context_processors.auth`,`django.contrib.messages.context_processors.messages`
* 在中间件中添加以下依赖,`django.contrib.auth.middleware.AuthenticationMiddleware`,`django.contrib.messages.middleware.MessageMiddleware`。
>2. 运行命令`python manage.py createsuperuser`创建一个超级用户,然后输入超级用户的用户名和密码。
>3. 在浏览器中输入`127.0.0.1:8000/admin/`进入`admin`登录界面。输入刚刚创建的用户名和密码,进入admin管理界面。
2. 如何将语言改成本地语言:
> 1. 在`MIDDLEWARE`的最后添加`django.middleware.locale.LocaleMiddleware`中间件。`django`会根据用户浏览器提交的数据`request.META['HTTP_ACCEPT_LANGUAGE']`做一个判断,来返回具体的语言。
> 2. 也可以不适用国际化,把`jango.middleware.locale.LocaleMiddleware`关掉,然后设置`LANGUAGE_CODE=zh_hans`。
3. 自定义`admin`:
> * 把需要管理的模型添加到`admin`中:首先要在`INSTALLED_APPS`中添加,然后在`admin.py`中注册`admin.site.register(ArticleModel)`。
> * 修改模型列表的`title`展示:在`ArticleModel`中添加一个`__unicode__`方法,然后返回你需要展示的字符串,比如要展示文章的标题:
>
```python
def __unicode__(self):
return self.title
```
> * `list_display`:可以修改展示的列表项
> * `search_fields`:可以提供搜索的查找项。
> * `list_filter`:可以提供一个过滤的表。
### `auth`系统:
1. `User`用户:
* 创建一个用户:`from django.contrib.auth.models import User`,然后使用`create_user`来创建一个用户。
* 修改密码:
```
from django.contrib.auth.models import User
u = User.objects.get(username='john')
u.set_password('new password')
u.save()
```
* 验证用户:
```python
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# 这个用户存在数据库中
else:
# 这个用户没有存在这个数据库中
```
* 登录:
```python
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# 登录成功
else:
# 用户没有被激活,不能登录
else:
# 用户名或者密码错误
```
* 注销:
```python
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# 注销这个用户。他的session信息将被清除掉。
```
* `login_required`装饰器:
```python
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
```
如果没有登录成功,会跳转到`settings.LOGIN_URL`指定的URL中。否则,直接执行函数中的内容。
* `user_passes_test`装饰器:
```python
from django.contrib.auth.decorators import user_passes_test
def email_check(user):
return user.email.endswith('@example.com')
@user_passes_test(email_check)
def my_view(request):
...
```
可以用来判断当前用户是否满足某种要求们如果没有满足,则会跳转到`settings.LOGIN_URL`.
* `permission_required`装饰器:传一个权限名称,如果这个用户有这个权限,则正常执行view函数,否则将跳转到`settings.LOGIN_URL`定义好的`url`去。
```python
from django.contrib.auth.decorators import permission_required
@permission_required('polls.can_vote')
def my_view(request):
...
```
* `User`模型常用属性和方法:
* `username`:用户名。
* `email`:邮箱。
* `groups`:多对多的组。
* `user_permissions`:多对多的用户权限。
* `is_staff`: 是否是`admin`的管理员。
* `is_active`: 是否激活,判断该用户是否可用。
* `is_superuser`: 是否是超级用户。
* `last_login`: 上次登录时间。
* `date_joined`: 注册时间。
* `is_authenticated`: 是否验证通过了。
* `is_anonymous`:是否是匿名用户。
* `set_password(raw_password)`: 设置密码,传原生密码进去。
* `check_password(raw_password)`: 检查密码。
* `has_perm(perm)`: 判断用户是否有某个权限。
* `has_perms(perm_list)`: 判断用户是否有权限列表中的某个列表。
*
2. `Permission`权限模型:
* 在模型中添加权限:
```python
class Task(models.Model):
class Meta:
permissions = (
("view_task", "Can see available tasks"),
("change_task_status", "Can change the status of tasks"),
("close_task", "Can remove a task by setting its status as closed"),
)
```
* 在代码中添加权限:
```python
from myapp.models import BlogPost
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(
codename='can_publish',
name='Can Publish Posts',
content_type=content_type,
)
```
* 用户的权限操作:
```python
myuser.user_permissions.set([permission_list])
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()
myuser.has_perm('foo.add_bar')
```
* 访问权限的方式:`appname`+`.`+`权限名称`。
3. `Group`模型:
* 所属包`django.contrib.auth.models.Group`
* 创建`Group`:必须传一个`name`参数进去。
* `Group`操作:
```python
group.permissions.set([permission_list])
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()
```
閱讀更多 哈雷彗星愛地球 的文章