【问题标题】:How can I allow users to edit their profiles in Django?如何允许用户在 Django 中编辑他们的个人资料?
【发布时间】:2020-11-04 00:55:27
【问题描述】:

我在 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>

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

【问题讨论】:

    标签: python django django-models django-forms django-users


    【解决方案1】:

    你有一个错误

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

    您得到一个UserProfile 对象,然后您尝试保存一个对象models.CharField,而不是将str 保存到phone_number。 使用ModelForm 来实现你所需要的。

    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 中你需要输入&lt;form enctype="multipart/form-data" method="post" action="..."&gt;

    【讨论】:

    • 非常感谢它的工作,我能够让用户更改他们的个人资料。但是在实际模型中有一个图像字段,所以当我尝试更改图像或上传新图像时它不会保存它
    • 修改答案
    【解决方案2】:

    重现这些步骤,您可能需要稍作修改:

    1.创建用户编辑表单

    在forms.py中

    from .models import UserProfile
    from django.forms import ModelForm
    
    class UserEditForm(ModelForm):
        class Meta:
            model = UserProfile
            fields = '__all__' # or ['phone_number', 'Birthday', 'city', 'only_fields_you_want_to_edit']
    

    2。创建视图:

    在views.py中

    from django.shortcuts import render, HttpResponseRedirect, get_object_or_404
    from django.urls import reverse
    from django.forms.models import model_to_dict
    from .models import UserProfile
    from .forms import UserEditForm
    
    def userEdit(request, user_id):
        user = get_object_or_404(Question, pk=user_id)
        if request.method == "GET":
            form = UserEditForm(initial=model_to_dict(user))
            return render(request, 'yourapp/useredit_form.html', {'form':form)
        elif request.method == "POST":
            form = UserEditForm(request.POST, instance=user)
            if form.is_valid():
                 form.save()
                 return HttpResponseRedirect(reverse('user_profile', kwargs={'uid':user.id}))
            else:
                 return HttpResponseRedirect(reverse('some_fail_loc'))
    

    3.创建模板

    在你的app/useredit_form.html中

    <form method="POST">
        {% csrf_token %}
        {{form}}
        <button type="submit">Submit</button>
    </form>
    

    4.设置网址:

    在 urls.py 中

    urlpatterns += [
        path('edit_user/<int:user_id>/', views.userEdit, name='user_edit'),
    ]
    

    现在尝试访问yourapp.com/edit_user/1。你已准备好出发。 :D

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 2023-04-10
      • 2015-10-08
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2012-03-16
      • 2013-08-23
      • 1970-01-01
      相关资源
      最近更新 更多