【问题标题】:Django form not saving emailDjango表单不保存电子邮件
【发布时间】:2020-06-16 19:12:03
【问题描述】:

我的看法-

from django.shortcuts import render, redirect
from .AuthForms import registerUserForm
from django.contrib import messages
from django.contrib.auth import login, authenticate
def registerUsers(request):
    if request.method == 'POST':
        ucf = registerUserForm(request.POST)
        if ucf.is_valid():
            ucf.save()
            new_user = authenticate(username = ucf.cleaned_data['username'], password = ucf.cleaned_data['password1'])
            login(request, new_user)
            return redirect('content')
    else:
        ucf = registerUserForm()

    return render(request, 'LoginAndSignUp/SignUpPage.html', {'ucf': ucf})

我的表格 -

我已经扩展了用户创建表单

from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm , PasswordResetForm
from django import forms 
class registerUserForm(UserCreationForm):
    email = forms.EmailField(widget = forms.EmailInput(attrs={'placeholder':'Email', 'autocomplete':'off'}))
    username = forms.CharField(widget= forms.TextInput(attrs={'placeholder':'Username','autocomplete':'off',}))
    password1 = forms.CharField(widget= forms.PasswordInput(attrs={'placeholder':'Password'}))
    password2 = None

    class meta:
        model = User
        fields = ['username', 'email', 'password1']

class userLoginForm(AuthenticationForm):
    username = forms.CharField(widget= forms.TextInput(attrs={'placeholder':'Username','autocomplete':'off'}))
    password = forms.CharField(widget= forms.PasswordInput(attrs={'placeholder':'Password'}))


class userPasswordResetEmailForm(PasswordResetForm):
    email = forms.EmailField(widget = forms.EmailInput(attrs={'placeholder':'Enter your email', 'autocomplete':'off',}))

    class Meta:
        model = User
        fields = '__all__'

这是我的模板。我想一切都是正确的,但仍然没有保存电子邮件

<form novalidate action="" method="post">
{%csrf_token%}


<div class="fieldWrapper">
{{ucf.email.errors}}
{{ucf.email}}
</div>
<div class="fieldWrapper">
{{ucf.username.errors}}
{{ucf.username}}
</div>
<div class="fieldWrapper">
{{ucf.password1.errors}}
{{ucf.password1}}
</div>
<div style="margin-bottom: 4%;">
<span class="director">Already with us? <a href="{%url 'login'%}">Log In</a></span>
<div class="director">
    <a href="{%url 'content'%}"><i class="fa fa-compass"></i> Explore anonymously</a>
</div>
</div>
<button class="primaryButton" type="submit">Sign Up</button>
</form>

电子邮件字段未将电子邮件保存到数据库,而用户名和密码已正确保存。有人请帮忙

【问题讨论】:

  • 在调用 ucf.is_valid() 之前,ucf.data 是否包含 email 的值?
  • @Vincent 不,它不包含。我很困惑,因为用户名和密码的值保存没有任何问题。而且我还删除了以前使用相同方法并且表单正确保存所有内容的版本。
  • 你能显示你使用的表单的html吗?
  • @Vincent 是的,我已经编辑了你可以看到的问题
  • 你使用javascript触发表单提交吗?我看到表单没有任何操作。

标签: django django-models django-forms django-views


【解决方案1】:

您的代码似乎没问题。我重新创建了您的项目,它按预期工作。用户名、密码和电子邮件保存在 auth_user 表中。这是我的样子:

urls.py

urlpatterns = [
    // other urls
    path('users/', register_users, name='create_user')
]

views.py

from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate

from users.forms import RegisterUserForm


def register_users(request):
    if request.method == 'POST':
        ucf = RegisterUserForm(request.POST)
        if ucf.is_valid():
            ucf.save()
            new_user = authenticate(username=ucf.cleaned_data['username'], password=ucf.cleaned_data['password1'])
            login(request, new_user)
            return redirect('content')
    else:
        ucf = RegisterUserForm()

    return render(request, 'users/sign_up_page.html', {'ucf': ucf})

forms.py

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


class RegisterUserForm(UserCreationForm):
    email = forms.EmailField(widget=forms.EmailInput(attrs={'placeholder': 'Email', 'autocomplete': 'off'}))
    username = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Username', 'autocomplete': 'off'}))
    password1 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password'}))
    password2 = None

    class Meta:
        model = User
        fields = ['username', 'email', 'password1']

sign_up_page.html

<form novalidate action="" method="post">
    {% csrf_token %}


    <div class="fieldWrapper">
        {{ ucf.email.errors }}
        {{ ucf.email }}
    </div>
    <div class="fieldWrapper">
        {{ ucf.username.errors }}
        {{ ucf.username }}
    </div>
    <div class="fieldWrapper">
        {{ ucf.password1.errors }}
        {{ ucf.password1 }}
    </div>
    <div style="margin-bottom: 4%;">
{#        <span class="director">Already with us? <a href="{% url 'login' %}">Log In</a></span>#}
        <div class="director">
{#            <a href="{% url 'content' %}"><i class="fa fa-compass"></i> Explore anonymously</a>#}
        </div>
    </div>
    <button class="primaryButton" type="submit">Sign Up</button>
</form>

【讨论】:

  • 很难说。尝试创建一个新应用并仅添加我的答案文件,看看它是否有效。
  • 是的,我认为这是唯一的选择。不管怎样,谢谢你的努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多