【问题标题】:Trying to update user information from 2 forms in Django尝试从 Django 中的 2 个表单更新用户信息
【发布时间】:2018-01-27 15:26:46
【问题描述】:

所以我有一个继承自 AbstractUser 的学生模型。我在一个视图中使用了 2 个表格进行注册,因为我需要将电子邮件、姓名和姓氏放在我的学生数据库(以及其他字段)中。现在我正在尝试制作一个更新配置文件视图,其中包含我专门为更新信息而制作的 2 个表单。但我想我弄错了..这里可能需要一点帮助。我需要学生能够更新他的电子邮件(来自用户模型)和他的照片、电话、姓名和姓氏(在学生模型中)。

<form method="POST" action="{% url 'profile_edit' %}" class="" >
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>
def profile_edit(request):
    user = request.user
    form1 = UserEditForm(request.POST or None, initial={'email': user.email,
                                                        })
    form2 = StudentEditForm(request.POST or None, initial={'name': user.student.name,
                                                           'surname': user.student.surname,
                                                           'phone': user.student.phone,
                                                           'photo': user.student.photo})
    if request.method == 'POST':
        if form1.is_valid() and form2.is_valid():
            user.email = request.POST['name']
            user.student.name = request.POST['name']
            user.student.surname = request.POST['surname']
            user.student.phone = request.POST['phone']
            user.student.photo = request.POST['photo']
            user.save()
            return render(request, 'index.html')
    context = {
        "form1": form1,
        "form2": form2
    }
    return render(request, "registration/profile_edit.html", context)
class UserForm(forms.ModelForm):
    email = forms.EmailField(required=True)
    password = forms.CharField(label='Password', max_length=32, required=True, widget=forms.PasswordInput)
    confirm_password = forms.CharField(label='Confirm', max_length=32, required=True, widget=forms.PasswordInput,
                                       help_text="Passwords must match!")

class StudentForm(forms.ModelForm):
    name = forms.CharField(max_length=30, required=True)
    surname = forms.CharField(max_length=50, required=True)
    student_ID = forms.CharField(required=True, max_length=14, min_length=14)
    photo = forms.ImageField(required=True)
    phone = forms.CharField(max_length=15, required=True)

    class Meta:
        model = Student
        fields = ('name', 'surname', 'phone', 'student_ID', 'photo')


class UserEditForm(forms.ModelForm):
    email = forms.EmailField(required=False)

    class Meta:
        model = User
        fields = ('email',)


class StudentEditForm(forms.ModelForm):
    name = forms.CharField(max_length=30)
    surname = forms.CharField(max_length=50)
    photo = forms.ImageField(required=False)
    phone = forms.CharField(max_length=15, required=False)

    class Meta:
        model = Student
        fields = ('name', 'surname', 'phone', 'photo')

问题是我没有得到表单,所以我要么在视图中做错了,要么是表单。

【问题讨论】:

    标签: python django


    【解决方案1】:
    <form method="POST" action="{% url 'profile_edit' %}" class="" >
        {% csrf_token %}
        {{ form1.as_p }}
        {{ form2.as_p }}
        <button type="submit">Save</button>
    </form>
    

    根据您的上下文,您的表单名称为 form1form2,因此 form 仅不会显示任何表单

    【讨论】:

    • 是的。我太瞎了,这是对的。但是现在我有一个小错误,我的学生模型现在实际上并没有保存任何东西。当我更改名称时,实际上它替换了用户模型中的电子邮件。我认为视图的某些部分搞砸了。
    • 您必须将表单保存在您的视图中,希望您注意到这一点。添加以下行 form1.save() 和 form2.save()
    • @LeLouch 保存后提示我:1048,“列'user_id'不能为空”
    【解决方案2】:

    您不需要两种形式。我已经回答了您之前的@​​987654321@ 导致了这个问题。

    它会让你免于大量不必要的代码。

    【讨论】:

    • 我不明白..这对我来说相当多
    • 我的回答的哪一部分引起了问题?
    • 我只是不想使用那种方法。
    • 好的,因为我没有得到答案,所以我使用了你的方法,但我的用户不会被保存。你愿意提供这个问题的代码吗?如前所述,不知道如何使用它。
    • 你在Else语句中添加了form.save()吗?
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2017-02-04
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多