I want to let my student to update his profile after he logged in, but I don't seem to be able to code the profile update properly. This is my code:
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)
The error 'AnonymousUser' object has no attribute 'name'
says that current user is not authenticated. You can make your view available only for authenticated users with login_required
decorator:
@login_required
def profile_edit(request):
pass
Also User model dont have name attribute, you need to access user's student attribute to get it:
form = StudentForm(request.POST or None, initial={'name': user.student.name,
'surname': user.student.surname})
I like this workaround a little bit more, you still need the login_required decorator.
In your models.py add
User.student = proberty(lambda p: Student.objects.get_or_create(user = p)[0])
Then in your views.py you can do something like:
student = request.user.student
if request.method != 'POST':
form = StudentForm(instance=student)
else:
form = StudentForm(request.POST, instance=student)
This is the perfect answer for this question. Just paste in your views.py file, where you have handled your update profile.
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')
Remember
1. email, fname & lname are the names of the form fields. Ensure that you put your form fields name.
2. return redirect('home')
is defined in the urls.py as views.home
. Ensure that you have replaced it with your views before running it.
path(r'user/updateProfile/<int:id>', views.handleUpdate, name="handleUpdate")
action="/user/updateProfile/{{request.user.id}}" method="POST"
Remember : user.id
only works when a user is logged in
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.