首页 > 解决方案 > 如何允许用户在 Django 中编辑他们的个人资料?

问题描述

我在 models.py 中有一个模型,如下所示:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.DO_NOTHING)
    phone_number = models.CharField(max_length=50, default='')
    Birthday = models.CharField(max_length=50, default='')
    city = models.CharField(max_length=50, default='')
    school = models.CharField(max_length=100, default='')
    course = models.CharField(max_length=50, default='')

我想让我的用户进行编辑,所以我在我的views.py中做了一个这样的函数:

    if request.method == 'POST':
        profil = UserProfile.objects.get(user=request.user)
        profil.phone_number = models.CharField(max_length=50, default='')
        profil.Birthday = models.CharField(max_length=50, default='')
        profil.city = models.CharField(max_length=50, default='')
        profil.school = models.CharField(max_length=100, default='')
        profil.course = models.CharField(max_length=50, default='')
        
        profil.save()
        
        return redirect('profile')  
 
    return render(request, 'edit_profile.html')

我的模板是:

<form action="." method="post">
        {% csrf_token %}    
        Phone Number:
        <input type="text" name="phone_number" value="{{  profil.phone_number }}" /><br />
        Birthday:
        <input type="text" name="Birthday" value="{{  profil.Birthday }}" /><br />
    
        city:
        <input type="text" name="city" value="{{  profil.city }}" /><br />
        school:
        <input type="text" name="school" value="{{  profil.school }}" /><br />
    
        course:
        <input type="text" name="course" value="{{  profil.course }}" /><br />
       
        <input type="submit" value="Save Changes" name="save" />
        <input type="reset" value="Cancel" name="cancel" />
        <br/>
    </form>

我不知道为什么,但在填写表格后,我收到一个错误,提示找不到页面。如果我检查现有的用户个人资料,则没有任何更新。请帮忙。

标签: pythondjangodjango-modelsdjango-formsdjango-users

解决方案


你有一个错误

profil = UserProfile.objects.get(user=request.user)
profil.phone_number = models.CharField(max_length=50, default='')

你得到一个UserProfile对象,然后尝试保存一个对象str而不是保存。用来实现你所需要的。phone_numbermodels.CharFieldModelForm

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = '__all__'

那么在您看来,您可以使用:

userprofile_form = UserProfileForm(request.POST if request.POST else None, instance = UserProfile.objects.get(user=request.user))
if request.method == 'POST':
    if form.is_valid():
        form.save()     
        return redirect('profile')  

return render(request, 'edit_profile.html', context={'userprofile_form': userprofile_form)

并在 html 中使用:

<form action="." method="post">
    {% csrf_token %}    
    Phone Number: {{ userprofile_form.phone_number }}
    Birthday: {{ userprofile_form.Birthday }}
    city: {{ userprofile_form.city }}
    school: {{ userprofile_form.school }}
    course: {{ userprofile_form.course }}           
    <input type="submit" value="Save Changes" name="save" />
    <input type="reset" value="Cancel" name="cancel" />
    <br/>
</form>

要不就

 <form action="." method="post">
     {% csrf_token %}    
     {{ userprofile_form }}           
     <input type="submit" value="Save Changes" name="save" />
     <input type="reset" value="Cancel" name="cancel" />
     <br/>
 </form>

如果您想使用上传文件,请不要忘记将您的文件放入您可以做到的表格 UserProfileForm(request.POST, request.FILES, instance = UserProfile.objects.get(user=request.user)) 中,您需要在 html 中放入<form enctype="multipart/form-data" method="post" action="...">


推荐阅读