【问题标题】:How do I extend UserCreationForm to include email field如何扩展 UserCreationForm 以包含电子邮件字段
【发布时间】:2015-12-27 21:31:57
【问题描述】:

我设法让标准的用户创建表单工作。其中仅包括用户名、密码 1 和密码 2 字段。但是,当我尝试包含电子邮件字段时,它永远不会出现在我的模板中。我想我可能在我看来遗漏了一些东西。这是我的代码:

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class UserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

views.py

from django.contrib.auth.forms import UserCreationForm 

def register_user(request):
if request.method == 'POST':
    form = UserCreationForm(request.POST)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/')

args = {}
args.update(csrf(request))

args['form'] = UserCreationForm()

return render_to_response('stories/register.html', args)

register.html

<form action = "/register/" method = "POST"> 
    {% csrf_token %} 

    <p>
    {{ form.username.label_tag }}
    {{ form.username}}
    </p>

    <p> 
    {{ form.email.label_tag }}
    {{ form.email }}
    </p>

    <p>
    {{ form.password1.label_tag }}
    {{ form.password1 }}
    </p>

    <p>
    {{ form.password2.label_tag }}
    {{ form.password2 }}
    </p>

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

此文件中的所有字段都将呈现到视图中,除了电子邮件字段。

谁能看出原因?!

【问题讨论】:

  • 如何在views.py中导入UserCreationForm?我敢打赌你输入了错误的UserCreationForm。还要给你的表单子类起不同的名字,比如UserCreationWithEmailFormUserCreateForm
  • @ozgur 我在views.py页面顶部附近只有“from django.contrib.auth.forms import UserCreationForm”。对吗?
  • 您能否更新您的问题并向我们展示您是如何在views.py 中导入它的?
  • 您在 views.py 中导入原始表单类,而不是从 forms.py 中导入自定义表单类
  • 我明白你的意思了。我现在解决了这个问题。它应该像这样导入:'from stories.forms import UserCreationForm'。谢谢@ozgur

标签: python django


【解决方案1】:

您在views.py 中导入了错误的UserCreationForm。您应该导入自己的表单,而不是 Django 的表单:

stories/views.py

from stories.forms import UserCreationForm
...

除此之外,您不必单独使用 &lt;p&gt;&lt;/p&gt; 包装所有字段,因为此作业存在 form.as_p()

register.html

<form action = "/register/" method = "POST">{% csrf_token %}
    {{ form.as_p }}
</form>

希望这会有所帮助。

【讨论】:

  • 我用

    标签包裹所有字段的原因是因为格式很奇怪!这是我能想到的唯一解决方法 D:

  • 我不认为这是你无法使用 css 处理的事情 :)
  • 对问题和这个答案的总体更新对我来说非常有用。我的基本模板 {% is user.is_anonymous%} 中有一些条件逻辑,它的链接使用 {% url 'viewname'} 坏了,但由于我不需要它们,我只是覆盖了那个块(我的导航栏)然后一切正常。谢谢你的好代码!
  • 如果您关心漂亮的 HTML 源代码,请查看 django 文档中的 Class BoundField
【解决方案2】:

我是 django 的新手,我尝试了你发布的内容,但我不得不改变工作......这就是我所做的。

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


class UserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True, label='Email')

    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

views.py

from .forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic


class SignUp(generic.CreateView):
    form_class = UserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'accounts/signup.html'

signup.html

{% extends 'polls/base.html' %}
{% load bootstrap4 %}
{% load static %}
{% block content %}
<body class="body_login">
  <form method="post" class="form-signup">
    {% csrf_token %}
    {% bootstrap_form form  %}
    <button type="submit" class="save btn btn-dark">Sign up</button>
  </form>
</body>
{% endblock %}

【讨论】:

    【解决方案3】:

    forms.py

    from django.contrib.auth.forms import UserCreationForm
    from django.contrib.auth.models import User
    
    class SignupForm(UserCreationForm):
        class Meta:
            model = User
            fields = ("username", "email",)
    

    views.py

    from django.urls import reverse_lazy
    from django.views import generic
    from accounts.forms import SignupForm
    
    class SignUpView(generic.CreateView):
        form_class = SignupForm
        success_url = reverse_lazy('login')
        template_name = 'stories/register.html'
    

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 2017-04-02
      • 2020-06-29
      • 1970-01-01
      • 2010-10-27
      • 2011-09-07
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多