在HTML上编辑表单时未传递任何值

时间:2018-10-20 04:21:51

标签: python django

我正在编辑从auth_User获取的Firtname和Lastname。当我编辑名称并保存时,将None值传递给名称。在验证页面源代码时,我没有看到任何错误。

form.py

moveToNext

view.py

from django.contrib.auth.models import User
class UserEditForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name','last_name', 'email')

HTML

def edit(request):
    if request.method == 'POST':
        user_form = UserEditForm(instance=request.user,
                                 data=request.POST)
        if user_form.is_valid():
            user_form.save()
            messages.success(request, 'Profile updated successfully!')
        else:
            messages.success(request, 'Error updating your profile!')
    else:
        user_form = UserEditForm(instance=request.user)
    return render(request,
                  'account/edit.html',
                  {'user_form': user_form})

2 个答案:

答案 0 :(得分:2)

您的表单字段上没有任何name属性,因此不会提交任何数据。在两个字段中添加一个name属性:

<input name="first_name" type="text" class="form-control" id="first_name" value="{{ user_form.first_name.value }}" > 
  <!-- ^^^^ note new name attribute -->

和:

<input name="last_name" type="text" class="form-control" id="last_name" value="{{ user_form.last_name.value }}" > 

还要注意,您已经在表单的字段中指定了email,但是HTML中没有email字段,这也会引起问题。您应该将该字段添加到HTML或将其从表单定义中删除。

您还可以考虑使用Django的form helpers to render the fields

答案 1 :(得分:1)

您在模板中创建的<input>标签不包含name属性。当您尝试提交表单时,这些项目为will not be sent

可以使用name属性访问每个表单字段的正确html_name,例如:

{{ user_form.first_name.html_name }}

@solarissmoke提到您应该考虑使用Django表单帮助程序,我非常同意。如果您不喜欢默认小部件在HTML中的显示方式,则可以在创建表单时添加类:

from django.contrib.auth.models import User
class UserEditForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name','last_name', 'email')
        widgets = {
            'first_name': forms.TextInput(attrs={'class': 'form-control'}),
            'last_name': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
        }

然后在您的模板中:

<div class="form-row">
  <label for="{{ user_form.first_name.auto_id }}" class="col-sm-2 control-label" placeholder="First Name">First Name:</label>
  <div class="col-sm-4">
    {{ user_form.first_name }}
  </div>
  <label for="{{ user_form.last_name.auto_id }}" class="col-sm-2 control-label">Last Name:</label>
  <div class="col-sm-4">
    {{ user_form.last_name }}
  </div>
</div>
<div class="form-row">
  <label for="{{ user_form.email.auto_id }}" class="col-sm-2 control-label">Email address:</label>
  <div class="col-sm-4">
    {{ user_form.email }}
  </div>
</div>