【问题标题】:Django - Form Does Not Save User ValuesDjango - 表单不保存用户值
【发布时间】:2019-05-25 22:12:16
【问题描述】:

我目前在我的网络应用程序的“myaccount.html”页面上有一个表单。

此表单呈现我想要的方式,但是由于某种原因我无法提交表单值以显示在 django 管理员中。

当用户点击“提交”时,页面刷新并且值保留在输入字段中。

我尝试了很多方法来解决这个问题,但没有运气。我以为我拥有一切,但也许我在某个地方遗漏了什么?

我还缺少什么来解决这个问题吗?

我是 Django 新手,因此非常感谢任何帮助。

谢谢!

users/views.py

from users.forms import CustomUserCreationForm
from django.views.generic.edit import CreateView

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_GET, require_POST
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import redirect
from django.shortcuts import render, redirect
from django.template import loader
from django.urls import reverse_lazy
from django.views import generic
from django.views.generic import FormView
from django.views.generic.edit import FormView
from django.conf import settings
from django import forms

class SignUp(generic.CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('home')
    template_name = 'signup.html'

class change(generic.CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('myaccount')
    template_name = 'myaccount.html'

    def form_valid(self, form):
        form.instance.name = self.request.name
        form.instance.address = self.request.address
        form.instance.zip_code = self.request.zip_code
        form.instance.mobile_number = self.request.mobile_number
        form.save()
        return super(change, self).form_valid(form)

users/models.py

from django.contrib.auth.models import AbstractUser, UserManager
from django.contrib.auth.models import User
from django.db import models
from django.urls import reverse

class CustomUserManager(UserManager):

    def get_by_natural_key(self, username):
        case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
        return self.get(**{case_insensitive_username_field: username})


#class CustomUser(AbstractUser):
#    objects = CustomUserManager()

class CustomUser(AbstractUser):
    # add additional fields in here
    name = models.CharField(max_length=100, null=True, blank=True)
    address = models.CharField(max_length=100, null=True, blank=True)
    zip_code = models.CharField(max_length=100, null=True, blank=True)
    mobile_number = models.CharField(max_length=100, null=True, blank=True)

    objects = CustomUserManager()

用户/forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    name = forms.CharField(required=True, label='', max_length=100,  widget=forms.TextInput(attrs={'placeholder': 'Full Name', 'class': 'form-control'}))
    address = forms.CharField(required=True, label='', max_length=100,  widget=forms.TextInput(attrs={'placeholder': 'Address', 'class': 'form-control'}))    
    zip_code = forms.CharField(required=False, label='', max_length=100,  widget=forms.TextInput(attrs={'placeholder': 'Zipcode', 'class': 'form-control'}))
    mobile_number = forms.CharField(required=False, label='', max_length=100,  widget=forms.TextInput(attrs={'placeholder': 'Mobile Number', 'class': 'form-control'}))


    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = ('username', 'email', 'name', 'address', 'zip_code', 'mobile_number')
        help_texts = {
            'username': '',
            'email': '',
#            'password1': 'None',
#            'password2': 'Test'
        }


class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = CustomUser
        fields = ('username', 'email')

用户/urls.py

from django.conf.urls import url
from django.conf.urls import *
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from . import views
from users import views
from .views import change

urlpatterns = [
#    path('change/', views.HomeView.as_view(), name='change'),
#    path('myaccount/change/', HomeView.as_view(), name='change'),
#    url(r'^myaccount/change/$', views.horse, name='change'),  
    path('signup/', views.SignUp.as_view(), name='signup'),
    path('myaccount/', views.change.as_view(), name='myaccount'),

]

用户/admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['email', 'username', 'name', 'address', 'zip_code', 'mobile_number']

admin.site.register(CustomUser, CustomUserAdmin)

HTML

{% block content %}

<form role="form" action="" method="post">
{% csrf_token %}
{{ form.non_field_errors }}   
{{ form.name }}
{{ form.name.errors }}
{{ form.address }}
{{ form.address.errors }}
{{ form.zip_code }}
{{ form.zip_code.errors }}
{{ form.mobile_number }}
{{ form.mobile_number.errors }}
<button class="btn btn-primary btn-success btn-round btn-extend" type="submit" value="Submit"><i class="zmdi zmdi-favorite-outline6"></i>Submit</button>
</form>                                                                                                                                         
</div>

{% endblock content %}

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    您没有显示从父类继承的字段的字段或错误。没有它们,表格将无效。尝试添加 {{ form.errors }} 以查看验证错误的完整列表。

    【讨论】:

    • 所以我按照你的建议添加了 sn-p,现在我在这个特定页面中看到了我不想要的字段的验证错误。usernamepassword1password2 是这些字段我不想在这个页面上。我目前将这些设置为signup.html。我该如何解决?
    • 如果你不想要这些字段,为什么要从 UserCreationForm 继承?
    • 最初,我想向 UserCreationForm 添加其他字段,因为我正在制作用户配置文件页面并认为不会发生此问题。我希望用户在前端更改他们的用户名和电子邮件,并且我希望所有表单值都填充到管理员中,最好的方法是什么?
    • 问题已解决!我制作了一个新表单并将class UserProfileAdmin(admin.ModelAdmin): list_display = ['name', 'address', 'zip_code', 'mobile_number', ] 添加到admin.py,现在我的表单数据填充正确......我只需要确保信息不会重复:)
    【解决方案2】:

    对于您的 form_valid 方法,请尝试以下方法:

    def form_valid(self, form):
        user = form.save(commit=False) # object with form data
        user.save() # save object
        return redirect('success') # and then redirect to success view
    

    对于您的模板,您还可以使用 for 循环来减少代码:

    {% for field in form %}
     {{ field.label_tag }}
     {{ field }}
     {% if field.errors %}
        {{ field.errors }}
     {% endif %}
    {% endfor %}
    

    【讨论】:

    • 我尝试了您的建议,但没有成功。我试图重定向到同一页面,但不确定这是否正确? return redirect('myaccount')
    • 发生了什么?有什么得救了吗?在 form_valid 方法中尝试 print (user) 并查看控制台中的输出。此外,理想情况下,您应该重定向到另一个页面并呈现成功消息或其他内容,以便用户知道他们的注册成功。
    • @spidey677 - 上面的评论忘记通知你了
    • 什么都没有解决。我试过print (name),控制台没有输出。我对 python/django 很陌生。我的朋友有什么问题?
    • @spidey677 - 尝试打印(用户名)
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2017-04-18
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2021-04-13
    • 2020-10-16
    相关资源
    最近更新 更多