python - 在 Django 中编辑配置文件的限制
问题描述
如何设置用户编辑个人资料的限制时间?
例如,他们应该只有 2 次编辑地址的机会。如果他们编辑地址 2 次,则下次打开编辑页面时该字段将被禁用。
我的模型:
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
变量添加到您的模型。
模型.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 })
然后disable_edits
在您的模板中或作为 API 的一部分使用(取决于您使用的是内置模板引擎还是 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/
您可以在此处阅读有关表单验证的更多信息。
推荐阅读
- android - 将图像作为意图传递给其他活动中的自定义标记
- selenium - 在python中以无头模式使用selenium webdriver通过Chrome文件上传对话框上传文件
- delphi - 新记录的 Delphi Master Detail 级联 ID 不能与 AutoGenerateValue 结合使用
- vue.js - 在没有 npm install 或 webpack 的情况下导入 vuejs 组件
- json - Codable 函数有什么问题?
- paypal - 贝宝专业 + 红衣主教。在哪里可以找到测试凭证?
- oauth-2.0 - {"error":"invalid_client","message":"客户端认证失败"}
- laravel - JWTAuth::fromUser($newRegistredUser) 给我当前登录用户的令牌
- c++ - 什么是 Linux 等效的 Visual Studio 的“发布模式下的构建代码”?
- apache-kafka - 我想通过一次又一次地调用它来制作一个小数据流