【发布时间】:2021-04-11 21:44:14
【问题描述】:
如何创建一个用户个人资料页面,其他用户可以查看而不能编辑个人资料,除非他们是用户?
我要解决的问题是 url 路由如何工作,最佳做法是将用户的个人资料存储在个人资料/或
这也将由一个视图和模板处理,并仅使用 {% 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