繁体   English   中英

Django 中编辑配置文件的限制

[英]limitaion for editing profile in Django

如何设置用户编辑个人资料的限制时间?

例如,他们应该只有 2 次编辑地址的机会。 如果他们编辑地址 2 次,则下次打开编辑页面时该字段将被禁用。

我的 model:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT, verbose_name='حساب کاربری')
    mobile = models.CharField('تلفن همراه', max_length=11, null=True, blank=True)
    address = models.TextField('آدرس', null=True, blank=True, max_length=5000)

并查看:

def profile_edit(request):
if request.method != 'POST':
    profile_form = ProfileForm(instance=request.user.profile)
    user_form = UserForm(instance=request.user)
else:
    profile_form = ProfileForm(data=request.POST, files=request.FILES, instance=request.user.profile)
    user_form = UserForm(data=request.POST, instance=request.user)
    if profile_form.is_valid() and user_form.is_valid():
        profile_form.save()
        user_form.save()
        return redirect('accounts:profile_details')
return render(request, 'accounts/profile_edit.html', {'profile_form': profile_form, 'user_form': user_form})

times_edited变量添加到您的 model。

模型.py

class Profile:
    user = models.OneToOneField(User, on_delete=models.PROTECT, verbose_name='حساب کاربری')
    mobile = models.CharField('تلفن همراه', max_length=11, null=True, blank=True)
    address = models.TextField('آدرس', null=True, blank=True, max_length=5000)
    times_edited = models.IntegerField(default=0)

视图.py

def profile_edit(request):
if request.method != 'POST':
    profile_form = ProfileForm(instance=request.user.profile)
    user_form = UserForm(instance=request.user)
    disable_edits = False
    if request.user.profile.times_edited > 2:
        disable_edits = True
else:
    profile_form = ProfileForm(data=request.POST, files=request.FILES, instance=request.user.profile)
    user_form = UserForm(data=request.POST, instance=request.user)
    if profile_form.is_valid() and user_form.is_valid():
        profile_form.save()
        user_form.save()
        request.user.profile.times_edited = request.user.profile.times_edited + 1
        return redirect('accounts:profile_details')
return render(request, 'accounts/profile_edit.html', {'profile_form': profile_form, 'user_form': user_form, 'disable_edits': disable_edits })

然后在您的模板中或作为 API 的一部分使用disable_edits (取决于您使用的是内置模板引擎还是 JS 框架)。

编辑:这是一种在后端检查它的方法

def clean_email(self):
    email = self.cleaned_data['email']
    if User.objects.get(pk=request.user.pk).profile.times_edited > 2:
        raise ValidationError("Email can no longer be edited")
    return User.objects.get(pk=request.user.pk).email

要将请求放入您的表单,您需要在此博客中执行以下操作:

https://brunobastos.net/how-to-access-the-httprequest-object-in-django-forms/

您可以在此处阅读有关表单验证的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM