簡體   English   中英

如何在 Django 中更新用戶配置文件

[英]How to update user profile in Django

我想讓我的學生在登錄后更新他的個人資料,但我似乎無法正確編碼個人資料更新。 這是我的代碼:

 class User(AbstractUser): pass class Student(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) name = models.CharField(max_length=30, null=True, blank=True, default=None) surname = models.CharField(max_length=50, null=True, blank=True, default=None)
 <form method="POST" action="{% url 'profile_edit' %}" class="" > {% csrf_token %} {{ form.as_p }} <button type="submit">Save</button>q </form>
 def profile_edit(request): user = request.student form = StudentForm(request.POST or None, initial={'name': user.name, 'surname': user.surname}) if request.method == 'POST': if form.is_valid(): user.student.name = request.POST['name'] user.student.surname = request.POST['surname'] user.save() return HttpResponseRedirect('index') context = { "form": form } return render(request, "registration/profile_edit.html", context)

錯誤'AnonymousUser' object has no attribute 'name'表示當前用戶未通過身份驗證。 您可以使用login_required裝飾器使您的視圖僅對經過身份驗證的用戶可用:

@login_required
def profile_edit(request):
    pass

此外 User 模型沒有 name 屬性,您需要訪問用戶的 student 屬性才能獲取它:

form = StudentForm(request.POST or None, initial={'name': user.student.name,
                                                  'surname': user.student.surname})

我更喜歡這個解決方法,你仍然需要 login_required 裝飾器。

在您的 models.py 添加

User.student = proberty(lambda p: Student.objects.get_or_create(user = p)[0])

然后在您的 views.py 中,您可以執行以下操作:

student = request.user.student
if request.method != 'POST':       
    form = StudentForm(instance=student)

else:
    form = StudentForm(request.POST, instance=student)

這是這個問題的完美答案。 只需粘貼您處理更新配置文件的 views.py 文件。

    def handleUpdate(request, id):
if request.method == "POST":
    username=request.POST['username']
    email=request.POST['email']
    fname=request.POST['fname']
    lname=request.POST['lname']

    if len(username)<8:
        messages.error(request, "Your username must not be under 8 characters")
        return redirect('home')

    if len(username)>10:
        messages.error(request, "Your username must not be more than 10 characters")
        return redirect('home')

    myuser=User.objects.get(pk=id)
    myuser.first_name=fname 
    myuser.last_name=lname
    myuser.email=email
    myuser.username=username
    myuser.save()
    messages.success(request, "Your account has been updated successfully")
    return redirect('home')

記住
1. email, fname & lname 是表單域的名稱。 確保您輸入表單字段名稱。
2. return redirect('home')在 urls.py 中定義為views.home 確保在運行之前已將其替換為您的視圖。

----------------
urls.py 中的 url
 path(r'user/updateProfile/<int:id>', views.handleUpdate, name="handleUpdate")

----------------
表格對其的作用:
 action="/user/updateProfile/{{request.user.id}}" method="POST"

請記住: user.id僅在用戶登錄時有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM