Django的标准库django.contrib包介绍

本文深入探讨了Django.contrib包的功能及其组成部分,包括自动化的站点管理工具、用户验证框架、评论应用等,解释了每个子包的作用及用途。

我们激活了 Django 后台,我们要使用自动化的站点管理工具(django.contrib.admin),所以最好对Django.contrib进行了解,它是啥?它是一个强大的功能包,是Django的标准库。
Django的标准库存放在 django.contrib 包中。每个子包都是一个独立的附加功能包。 这些子包一般是互相独立的,不过有些django.contrib子包需要依赖其他子包。在 django.contrib 中对函数的类型并没有强制要求 。其中一些包中带有模型(因此需要你在数据库中安装对应的数据表),但其它一些由独立的中间件及模板标签组成。
django.contrib 开发包共有的特性是: 就算你将整个django.contrib开发包删除,你依然可以使用 Django 的基础功能而不会遇到任何问题。 当 Django 开发者向框架增加新功能的时,他们会严格根据这一原则来决定是否把新功能放入django.contrib中。
django.contrib 由以下开发包组成:

  • admin : 自动化的站点管理工具。
  • admindocs : 为Django admin站点提供自动文档。
  • auth : Django的用户验证框架。
  • comments : 一个评论应用,关于这个应用的更多信息请参见Django的官方网站。
  • contenttypes : 这是一个用于引入文档类型的框架,每个安装的Django模块作为一种独立的文档类型。 这个框架主要在Django内部被其他应用使用,它主要面向Django的高级开发者。可以通过阅读源码来了解关于这个框架的更多信息,源码的位置在 django/contrib/contenttypes/。
  • csrf : 这个模块用来防御跨站请求伪造(CSRF)。
  • databrowse:帮助你浏览数据的Django应用。 
  • flatpages : 一个在数据库中管理单一HTML内容的模块。 
  • formtools : 一些列处理表单通用模式的高级库。 
  • gis : 为Django提供GIS(Geographic Information Systems)支持的扩展。 举个例子,它允许你的Django模型保存地理学数据并执行地理学查询。请参看http://geodjango.org/上的文档。
  • humanize : 一系列 Django 模块过滤器,用于增加数据的人性化。
  • localflavor:针对不同国家和文化的混杂代码段。例如,它包含了验证美国的邮编 以及爱尔兰的身份证号的方法。
  • markup : 一系列的 Django 模板过滤器,用于实现一些常用标记语言。 
  • redirects : 用来管理重定向的框架。 
  • sessions : Django 的会话框架。 
  • sitemaps : 用来生成网站地图的 XML 文件的框架。
  • sites : 一个让你可以在同一个数据库与 Django 安装中管理多个网站的框架。
  • syndication : 一个用 RSS 和 Atom 来生成聚合订阅源的的框架。
  • webdesign : 对设计者非常有用的Django扩展。到编写此文时,它只包含一个模板标签{% lorem %}。

 本文转自http://www.nowamagic.net/academy/detail/1318716
<think>我们正在处理一个关于Django的问题,用户希望导入表单模块和User模型。根据引用内容,我们知道在Django中,用户认证系统通常使用`django.contrib.auth.models`中的`User`模型。同时,创建表单可以使用`django.forms`模块。 用户提供的代码片段是: ```python from django import forms from django.contrib.auth.models import User ``` 这个导入语句本身是正确的。但是,根据引用[2]和引用[3],我们知道有时需要扩展用户模型,比如通过继承`AbstractUser`来添加额外字段。如果用户已经自定义了用户模型(如引用[2]中的`UserInfo`),那么应该导入自定义的模型而不是默认的`User`。 但是,用户的问题中并没有提到自定义用户模型,所以我们可以假设用户使用的是默认的`User`模型。因此,上述导入语句是合适的。 此外,引用[1]、[4]、[5]提到了关于登录视图的问题,但用户当前的问题是关于表单和用户模型的导入,因此这些引用可能不直接相关。不过,我们可以推测用户可能在创建一个与用户相关的表单,比如用户注册表单或登录表单。 下面我们将创建一个使用`User`模型的表单示例,例如一个用户注册表单。 ### 创建用户注册表单 在Django中,我们可以创建一个继承自`forms.ModelForm`的表单类,用于用户注册。这个表单将使用`User`模型,并含我们需要的字段。 ```python from django import forms from django.contrib.auth.models import User class UserRegistrationForm(forms.ModelForm): password = forms.CharField(label='密码', widget=forms.PasswordInput) password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput) class Meta: model = User fields = ('username', 'email', 'first_name', 'last_name') def clean_password2(self): cd = self.cleaned_data if cd['password'] != cd['password2']: raise forms.ValidationError('两次输入的密码不一致!') return cd['password2'] ``` 在这个表单中,我们添加了两个密码字段(用于密码确认),并重写了`clean_password2`方法以验证两次输入的密码是否一致。然后,我们在`Meta`类中指定使用`User`模型,并选择了一些字段。 ### 注意事项 1. 如果用户已经自定义了用户模型(如引用[2]中的`UserInfo`),那么应该导入自定义的模型,例如: ```python from .models import UserInfo ``` 然后在表单的`Meta`类中将`model`指定为`UserInfo`。 2.Django 2.1及以上版本,登录视图的导入方式发生了变化(如引用[4]和引用[5]所示),但用户的问题是关于表单和用户模型的,所以暂时不需要考虑登录视图。 ### 相关问题 根据用户的问题和我们的回答,生成以下相关问题: 1. 如何扩展Django默认的User模型? 2. 如何在Django中创建用户注册视图? 3. 如何处理用户注册表单的验证和保存? 4. 自定义用户模型后,如何修改登录表单? 5. Django表单中如何添加自定义验证逻辑?</think>根据您提供的引用信息和当前需求,我将帮助您解决Django表单和用户模型导入的相关问题。 ### 导入Django表单和用户模型 您需要的导入语句本身是正确的: ```python from django import forms from django.contrib.auth.models import User ``` ### 常见问题解析 1. **自定义用户模型**(如引用[2][3]所示): 当您扩展了`AbstractUser`时,应导入自定义模型而非默认User: ```python from .models import CustomUser # 替换为您的自定义模型 ``` 2. **视图导入问题**(如引用[1][4][5]所示): 在Django 2.x+版本中,登录视图的导入方式已变更: ```python # Django 1.x 方式 (已弃用) from django.contrib.auth.views import login # Django 2.x+ 正确方式 from django.contrib.auth.views import LoginView ``` ### 完整表单示例 ```python from django import forms from django.contrib.auth.models import User # 或您的自定义模型 from django.contrib.auth.forms import AuthenticationForm # 登录表单基类 class UserRegistrationForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput) class Meta: model = User fields = ('username', 'email', 'first_name', 'last_name') def clean_password2(self): # 验证两次密码是否匹配 if self.cleaned_data['password'] != self.cleaned_data['password2']: raise forms.ValidationError("两次输入的密码不匹配") return self.cleaned_data['password2'] # 登录表单(使用Django 2.x+方式) class CustomLoginForm(AuthenticationForm): remember_me = forms.BooleanField(required=False, label="记住我") ``` ### 视图配置示例 ```python # urls.py (Django 2.x+) from django.contrib.auth.views import LoginView from .forms import CustomLoginForm urlpatterns = [ path('login/', LoginView.as_view( template_name='users/login.html', authentication_form=CustomLoginForm # 使用自定义表单 ), name='login'), ] ``` ### 关键注意事项 1. 如果使用自定义用户模型(如引用[2][3]),需在`settings.py`中配置: ```python AUTH_USER_MODEL = 'yourapp.CustomUser' ``` 2. 表单验证时,Django会自动处理密码哈希化,但需要在`views.py`中手动保存: ```python def register(request): if request.method == 'POST': form = UserRegistrationForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.set_password(form.cleaned_data['password']) # 密码哈希化 user.save() ``` 3. 对于登录视图,Django 3.x+要求使用`LoginView`类视图(如引用[4][5]),不再支持函数视图直接导入`login`[^1][^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值