【问题标题】:Change URL Path for View Profile Page - Django更改查看个人资料页面的 URL 路径 - Django
【发布时间】:2021-04-11 21:44:14
【问题描述】:

如何创建一个用户个人资料页面,其他用户可以查看而不能编辑个人资料,除非他们是用户?

我要解决的问题是 url 路由如何工作,最佳做法是将用户的个人资料存储在个人资料/或 页面上,然后像最近使用的帖子一样加载单个用户的数据通过 url 传递的用户名或 id?

这也将由一个视图和模板处理,并仅使用 {% if request.user == profile.user %} 来显示编辑配置文件等内容吗?

我的问题是任何用户都可以在编辑 url 时为其他人编辑配置文件

例如,我的 id 是 www.test.com/profile/44/,而其他用户的 id 是 www.test.com/profile/40/ 好的,现在当我将链接编辑为 40 而不是 44 时,我可以访问和编辑第二个用户!如何解决这个问题

models.py:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    email_confirmed = models.BooleanField(default=False)

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
        instance.profile.save()
    def __str__(self):
        return self.user

urls.py:

from django.urls import path
from blog_app.views import ProfileView

urlpatterns = [
    path('profile/<int:pk>/', ProfileView.as_view(), name='profile'),
]

forms.py:

# Profile Form

class ProfileForm(forms.ModelForm):
    # constructor of the UserForm, not Meta
    def __init__(self, *args, **kwargs):
        super().__init__(*args,**kwargs)
        self.fields['username'].widget.attrs.update({'class':'form-control','placeholder':' Enter your username in English ','style': 'font-size:19px;text-align: center;'})
    class Meta:
        model = User
        fields = [
            'username',
            'first_name',
            'last_name',
            'email',
            ]

views.py:

# Edit Profile View
class ProfileView(UpdateView):
    model = User
    form_class = ProfileForm
    success_url = reverse_lazy('home')
    template_name = 'user/commons/profile.html'
    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():

            user = form.save(commit=False)
            user.is_active = False # Deactivate account till it is confirmed
            user.save()

            current_site = get_current_site(request)
            subject = 'Activate Your MySite Account'
            message = render_to_string('user/emails/account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),
            })
            user.email_user(subject, message)

            messages.success(request, ('Please Confirm your new email to change email.'))

            return redirect('login')
        return render(request, self.template_name, {'form': form})

html页面:

<button type="button" id="submit"> <a href="{% url 'profile' user.id %}" > edit profile info </a></button>

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    您可以覆盖get_object() 方法以始终从request.user 返回当前登录的用户,这样您就无需在路径中提供“pk”变量。

    在你的视图中实现get_object()

    class ProfileView(UpdateView):
        model = User
        form_class = ProfileForm
        success_url = reverse_lazy('home')
        template_name = 'user/commons/profile.html'
        
        def get_object(self, queryset=None):
            return self.request.user
    

    然后配置不带pk的路径

    urlpatterns = [
        path('profile/me/', ProfileView.as_view(), name='profile'),
    ]
    

    请注意,您应该在该视图上使用 login_required() 装饰器或 LoginRequiredMixin 以避免匿名用户访问此视图。

    【讨论】:

    • 非常感谢兄弟你救了我! ,请问您,当我在视图中键入 login_required() 时,它会显示错误,但是当我使用 @method_decorator(login_required, name='dispatch') 时,这里发生了什么
    • 很高兴为您提供帮助!你能赞成答案吗? :)
    • 关于method_decorator,login_required是基于函数的视图的装饰器。在基于类的视图上使用时,您需要将“dispatch”方法包装起来,作为调度“get”、“post”等方法的视图的根方法。 method_decorator 是一个实用程序,用于包装类的方法而不在代码中覆盖它们,
    • 好吧,谢谢您的解释.. 非常感谢?我忘了投票答案??
    猜你喜欢
    • 2013-11-12
    • 2014-06-26
    • 1970-01-01
    • 2023-03-30
    • 2023-03-23
    • 2014-11-17
    • 2012-09-30
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多