Django中模型与它的形式之间的关系,以及用户身份验证

时间:2017-06-21 14:11:04

标签: django

我正在从旧的PHP / apache服务器迁移到Django。我对模特形式'。

感到有点难过

据我所知,"模型"是我的网站/服务器中持久性元素的抽象 - 特别是这是物理存储的东西,比如在数据库中,并定义数据库中的字段(读取列)。

我开始移动网站的身份验证部分,并发现模型,特别是用户模型(我做了一个空的用户继承AbstractUser以防万一我需要扩展的东西)。现在我想创建一个简单的两个字段表单来验证登录。

表格:

  1. 用户名(默认情况下为User的字段)
  2. 密码(不是)。
  3. 即使是'用户名'需要在模型表格中重新定义。所以我的问题:

    1. 模型形式的优势是什么(仅仅是一种形式)? - 无论如何,您似乎还在重新定义字段,显然有时会在模型顶部添加字段。
    2. 特别是对于身份验证,我可能需要以某种方式存储与用户关联的盐渍哈希,使用它来比较我的密码并检索用户对象。这是我在Django文档中很难找到的东西 - 它们只是在认证上写得太多,而不是一个完整的代码示例。我把它放在"验证"表单方法,检索对象并将其存储在会话或其他内容中?
    3. 如果模型表格与相关模型之间存在更深层次的关系,我也想知道。

1 个答案:

答案 0 :(得分:1)

简单的django形式和模型形式有很大不同。

class ArticleForm(ModelForm):
     class Meta:
         model = Article
         fields = ['pub_date', 'headline', 'content', 'reporter']

上面的示例说明您不必在此处编写任何表单字段。模型表单本身将创建一个基于模型中提供的属性的表单(本例中为“文章”)。

如果您创建一个简单的django表单,那么它将类似于:

class ArticleForm(forms.Form):
    some_field = forms.CharField(some_attrs)
    ...

django用户模型为您提供身份验证所需的一切。当您只想创建用户import django.contrib.auth.models.User并使用create方法创建对象时。然后,当您要使用authenticate方法验证用户时。

from django.contrib.auth import authenticate, login
def user_login(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    user = authenticate(request, username=username, password=password)
    # after authentication login the user or set cookies or modify the session or some other action can be taken
    return HttpResponse("Some response or use render for html page")

用户名和密码将来自您的帖子请求。

如果要扩展默认的Django用户模型,可以在扩展模型中将django用户模型用作onetoonefield

class AppUser(models.Model):
    user = models.OneToOneField(User)
    ... # other custom fields