How to edit user's profile page on django?

℡╲_俬逩灬. 提交于 2020-06-17 08:05:31

问题


My django project has multiple functions, one of them lets the user update its profile(User model"first_name, username and email" Profile model" bio and profile picture") this used to perfectly work until I added a follow sistem, it is like the whole Profile and User model doesnt exist anymore so when trying to edit those fields, the code returns a AttributeError: 'User' object has no attribute 'profile' error, saying this line of code on the views.py file is wrong form1 = UpdateProfileForm(request.POST or None, request.FILES, instance=request.user.profile), I think I am missing something on there or there is probably there is something wrong.

views.py

    def profile(request, username=None):
        profile, created = Profile.objects.get_or_create(user=request.user)
        user = User.objects.get(username=username)
        if username:
            post_owner = get_object_or_404(User, username=username)
            user_posts = Profile.objects.filter(user_id=post_owner)
            is_following = Following.objects.filter(user=request.user, followed=user)
            following_obj = Following.objects.get(user=user)
            follower = following_obj.follower.count()
            following = following_obj.followed.count()
        else:
            post_owner = request.user
            user_posts = Profile.objects.filter(user=request.user)

        args1 = {
            'post_owner': post_owner,
            'user_posts': user_posts,
            'follower': follower,
            'following': following,
            'connection': is_following,
        }
        return render(request, 'profile.html', args1)

    def edit_profile(request):
        profile, created = Profile.objects.get_or_create(user=request.user)
        if request.method == 'POST':
            form = EditProfileForm(request.POST, instance=request.user)
            form1 = UpdateProfileForm(request.POST or None, request.FILES, instance=request.user.profile)
            if form.is_valid and form1.is_valid:
                form.save()
                form1.save()
                return redirect('profile')
            else:
                form = EditProfileForm(instance=request.user)
                form1 = UpdateProfileForm(instance=request.user)
            args = {
                'form': form,
                'form1': form1,
            }
            return render(request, 'profile-edit.html', args)

models.py

 class Profile(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
     profile_pic = models.ImageField(upload_to='profile_pics', null=True, blank=True, default='default.png')
     bio = models.CharField(max_length=400, default=1, null=True)
     connection = models.CharField(max_length = 100, blank=True)
     follower = models.IntegerField(default=0)
     following = models.IntegerField(default=0)

     def __str__(self):
         return f'{self.user.username} Profile'

class Following(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    followed = models.ManyToManyField(User, related_name="followed")
    follower = models.ManyToManyField(User, related_name="follower")

    @classmethod
    def follow(cls, user, another_account):
        obj, create = cls.objects.get_or_create(user = user)
        obj.followed.add(another_account)
        print("followed")

    @classmethod
    def unfollow(cls, user, another_account):
        obj, create = cls.objects.get_or_create(user = user)
        obj.followed.remove(another_account)
        print("unfollowed")

    def __str__(self):
        return f'{self.user.username} Profile'

forms.py

class EditProfileForm(UserChangeForm):
    class Meta:
        model = User
        fields = (
            'first_name',
            'username',
            'email',
        )
        exclude = ('password',)

class UpdateProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = (
            'bio',
            'profile_pic',
        )

If you need to see more code please let me know;)


回答1:


Try this:

def edit_profile(request):
    profile, created = Profile.objects.get_or_create(user=request.user)
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        form1 = UpdateProfileForm(request.POST or None, request.FILES, instance=request.user.profile)
        if form.is_valid() and form1.is_valid():
            form.save()
            form1.save()
            return redirect('profile')
    else:
        form = EditProfileForm(instance=request.user)
        form1 = UpdateProfileForm(instance=profile)
        args = {
          'form': form,
          'form1': form1,
        }
    return render(request, 'profile-edit.html', args)



回答2:


The solution I found temporarily to solve this problem is to just changed Profile's user object to OneToOneField and Following's user model to ForeignKey.



来源:https://stackoverflow.com/questions/62353214/how-to-edit-users-profile-page-on-django

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!