【问题标题】:How to add email address in signup_form.html - Django-crispy-forms如何在 signup_form.html 中添加电子邮件地址 - Django-crispy-forms
【发布时间】:2018-11-26 10:30:35
【问题描述】:

我的signup_form.html如下,有什么办法可以在这个表单中添加邮箱地址而不改变后端代码的views.py?,我想让用户在注册的时候填写邮箱地址,

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
  <div class="row">
    <div class="col-md-8 col-sm-10 col-12">
      <form method="post" novalidate>
        {% csrf_token %}
        <input type="hidden" name="next" value="{{ next }}">
        {{ form|crispy }}
        <button type="submit" class="btn btn-success">Sign up</button>
      </form>
    </div>
  </div>
{% endblock %}

【问题讨论】:

  • 如何从给定的表单类子类化并在那里添加电子邮件字段,并呈现您的自定义表单而不是内置标准表单?
  • 如果呈现我的自定义表单,我必须更改views.py 对吗?我想保留内置的标准表单,因为它很简单,不需要views.py,它只有一个signup_form.html
  • 不,您不需要更改视图,它将呈现为标准表单,但您添加了额外的字段。
  • 如果你愿意,我可以在答案中更广泛地解释,但我现在来自智能手机,这将有点低质量,只是简单的逻辑。
  • @Chiefir 您能否在答案中广泛解释一下?我可以等一下,非常感谢您的帮助。????

标签: django python-3.x django-forms django-crispy-forms


【解决方案1】:

如果你使用标准内置的 Django 注册表单 - 你可以像这样覆盖它:

from django.contrib.auth.forms import UserCreationForm

class UserCreateForm(UserCreationForm):
email = forms.EmailField(required=True,
                         label='Email',
                         error_messages={'exists': 'Oops'})

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


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

    def clean_email(self):
        if User.objects.filter(email=self.cleaned_data['email']).exists():
            raise ValidationError(self.fields['email'].error_messages['exists'])
        return self.cleaned_data['email']

接下来我猜如果你说你没有注册视图(如果我理解正确的话) - 你的网址中有类似的字符串:

from django.views.generic.edit import CreateView
from django.contrib.auth.forms import UserCreationForm

    urlpatterns = [
        path('register/', CreateView.as_view(
                template_name='register.html',
                form_class=UserCreationForm,
                success_url='/')
    ]

因此,您只需在此处将 UserCreationForm 替换为您的自定义 UserCreateForm 即可。

【讨论】:

  • 嗨,酋长,我的网址如下:patterns = [ path('accounts/signup/', CreateView.as_view(), form_class=UserCreationForm, name='signup'),我得到了TypeError: _path() got an unexpected keyword argument 'form_class'
  • 那是什么?
  • 我在我的项目中使用patterns = [path()],所以我得到了那个错误,我想我需要更改语法。
  • 仔细查看我的帖子。 CreateView.as_view() - 这不是我所拥有的。
  • 再次感谢您的耐心等待,现在我在base.py &lt;a href="{% url 'signup' %}" class="btn btn-primary" role="button"&gt;Sign up&lt;/a&gt; 得到了Reverse for 'signup' not found. 'signup' is not a valid view function or pattern name. 的错误,signup_form.html 和signup.html 在文件夹templates/registration 下,现在路径是` path('accounts/signup/', CreateView.as_view(template_name='registration/signup.html', form_class=UserCreationForm, success_url='/'),`
猜你喜欢
  • 2018-08-21
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
相关资源
最近更新 更多