模型与it之间的关系';Django中的s表单和用户身份验证

模型与it之间的关系';Django中的s表单和用户身份验证,django,Django,我正在将一些东西从旧的PHP/apache服务器迁移到Django。我有点被“模型形式”难住了 据我所知,“模型”是对我的网站/服务器中持久元素的抽象——具体来说,这是物理存储的东西,比如说在数据库中,并定义数据库中的字段(读取列) 我开始移动站点的身份验证部分,发现了模型,特别是用户模型(我让一个空用户继承AbstractUser,以防我需要扩展东西)。现在我想创建一个简单的两字段表单,以验证登录 表格: 用户名(默认情况下为用户字段) 密码(不是) 甚至“用户名”也需要在模型表单中重新定义。

我正在将一些东西从旧的PHP/apache服务器迁移到Django。我有点被“模型形式”难住了

据我所知,“模型”是对我的网站/服务器中持久元素的抽象——具体来说,这是物理存储的东西,比如说在数据库中,并定义数据库中的字段(读取列)

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

表格:

  • 用户名(默认情况下为用户字段)
  • 密码(不是)
  • 甚至“用户名”也需要在模型表单中重新定义。所以我的问题是:

  • 模型表单(相对于表单)的优势是什么看起来您正在重新定义字段,而且很明显,有时会在模型顶部添加字段
  • 特别是对于身份验证,我可能需要以某种方式存储与用户关联的salt散列,使用该散列比较密码并检索用户对象。我发现在Django文档中很难找到这一点——它们只是编写了太多关于身份验证的内容,而没有完整的代码示例。我是否将其放在表单的“validate”方法中,在那里检索一个对象并将其存储在会话或其他内容中

  • 如果模型表单和关联模型之间存在更深层的关系,我也想知道。

    简单django表单和模型表单有很大的区别

    class ArticleForm(ModelForm):
         class Meta:
             model = Article
             fields = ['pub_date', 'headline', 'content', 'reporter']
    
    上面的例子说明了您不必在这里写任何表单字段。模型表单本身将创建一个基于模型中提供的属性的表单(本例中为“Article”)

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

    class ArticleForm(forms.Form):
        some_field = forms.CharField(some_attrs)
        ...
    
    django用户模型为您提供了身份验证所需的一切。当您想要创建用户时,只需导入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")
    
    用户名和密码将来自您的post请求

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

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

    密码也是用户模型的一个字段。用户模型已以哈希形式(sha-256)存储密码。你真的不需要做任何散列运算。@ArpitSolanki知道了,文档已经足够模糊了,我错过了,谢谢。如果可能的话,我希望能给出一个代码示例的答案。@ArpitSolanki还有,我现在正在渲染-密码字段正在渲染为类型文本输入。我知道如何使用“widgets”来改变这一点,但为什么这是默认值呢?因为对于django来说,它只是一个文本字段,没有什么比得上密码字段。您必须手动操作,谢谢,因此模型表单只需要指定字段名,并初始化字段本身。我缺少两件事:我在哪里认证?我在文档中看到了您发布的代码,但我显然不想在加载时进行身份验证,而是在提交表单时进行身份验证。由于我控制表单操作,我应该将POST请求定向到哪里?是否在那里获取表单/模型上下文?请参见编辑。为user_login方法创建一个url,并将其放入您的表单ActionThank,找到我需要的内容。