Django 如何在另一个内置视图(如FormView)中传递UserCreationForm

Django 如何在另一个内置视图(如FormView)中传递UserCreationForm,django,django-forms,Django,Django Forms,作为一名初学者,我正在尝试浏览Django文档 为了允许用户注册,我想创建一个注册视图 现在,我已经看到了许多关于如何使用基于函数的视图(通过内置的 我想做的是利用所有的内置视图,所以我想知道是否可以将UserCreationForm传递到内置的FormView 目前,我已设法在所需的URL上呈现表单,但一旦提交,它就不会创建用户,即使它将我重定向到主页(如需要) 我怎样才能解决这个问题 这是我的观点 from django.shortcuts import render from django

作为一名初学者,我正在尝试浏览Django文档

为了允许用户注册,我想创建一个注册视图

现在,我已经看到了许多关于如何使用基于函数的视图(通过内置的

我想做的是利用所有的内置视图,所以我想知道是否可以将
UserCreationForm
传递到内置的
FormView

目前,我已设法在所需的URL上呈现表单,但一旦提交,它就不会创建用户,即使它将我重定向到主页(如需要)

我怎样才能解决这个问题

这是我的观点

from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
from django.views.generic.edit import FormView


class RegisterView(FormView):
    template_name = 'registration/register.html'
    form_class = UserCreationForm
    success_url = '/home/'
这是我的html

{% block content %}
<form method="post" action="{% url 'home' %}">
    {% csrf_token %}
    <table>
        <tr>
            <td>{{ form.username.label_tag }}</td>
            <td>{{ form.username }}</td>
        </tr>
        <tr>
            <td>{{ form.password1.label_tag }}</td>
            <td>{{ form.password1 }}</td>
            <td>{{ form.password2.label_tag }}</td>
            <td>{{ form.password2 }}</td>
        </tr>
    </table>

    <input type="submit" value="Register">
</form>
{% endblock %}

@Mirko Oricci

您没有将表单值保存到db。这就是为什么它重定向到success_url而不保存数据

你需要保存它。因此,您应该使用form\u valid方法来保存表单值

from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
from django.views.generic.edit import FormView


class RegisterView(FormView):
    template_name = 'registration/register.html'
    form_class = UserCreationForm
    success_url = '/home/'

    def form_valid(self, form):
        form.save()  // form data will be saved
        return super(RegisterView, self).form_valid(form)
请更改registration.html表单操作
我已经检查过了,并且我正在管理面板中获得新用户。

好的,我已经成功地完成了这项工作

基本上,我的原始代码是正确的,唯一需要更改的是我定义的
RegisterView
继承的模型表单

它不能作为
FormView
的子类工作,但必须是
CreateView
的子类

如果有人能在有帮助的评论中向我解释原因:)

我找到的答案来自


另外,我必须
撤销成功的URL。

谢谢你的回答。我已经尝试过你的解决方案(这是有道理的),但是当我在管理网站上检查,并点击“用户”链接时,新用户不是created@MirkoOricci,我已经编辑了代码,并在最后正确地进行了检查。它起作用了。请检查一下。@Iqbal Hussain,我刚刚复制并粘贴了您编写的所有代码,但是当我签入管理员时,我得到的唯一用户就是管理员本身。我不知道他为什么不工作。设置中可能有什么东西?我不知道…@MirkoOricci,您是否在url.py中创建了路由,是否将表单操作更改为viewmethod,该方法在url.py文件中定义为路由器名称='register'。所以表单操作将是@MirkoOricci,我已经编辑了代码以显示错误消息。现在,您可以确认为什么它不保存。
from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
from django.views.generic.edit import FormView


class RegisterView(FormView):
    template_name = 'registration/register.html'
    form_class = UserCreationForm
    success_url = '/home/'

    def form_valid(self, form):
        form.save()  // form data will be saved
        return super(RegisterView, self).form_valid(form)
{% block content %} 


{% if form.errors %} {% for field in form %} {% for error in field.errors %}
  <div class="alert alert-danger">
     <strong>{{ error|escape }}</strong>
  </div>
{% endfor %} {% endfor %}{% endif %}

  <form method="post" action="{% url 'register' %}">
   {% csrf_token %}
  <table>

   <tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
   </tr>

  <tr>
  <td>{{ form.password1.label_tag }}</td>
  <td>{{ form.password1 }}</td>
  <td>{{ form.password2.label_tag }}</td>
  <td>{{ form.password2 }}</td>
</tr>

</table>

<input type="submit" value="Register" />
</form>



{% endblock %}
from django.urls import path, include
from .views import RegisterView
urlpatterns = [
       path('', RegisterView.as_view(), name='register')
   ]