django - 如何使用隐藏逻辑通过 UpdateView 更新 CustomUser 值
问题描述
我已经为此花费了几个小时,但我看不到任何迹象表明为什么标志上的更改没有通过。请注意,更改表格已经适用于所有公开的字段,即用户可以进入并更改名称或国家/地区,单击更新配置文件后它将被保存。我现在要做的是,每当客户端对表单进行更新时,也将 Confirmed_email 标志更改为 True (但不告诉或让用户看到它)。为此,我通过“if user.social_auth.exists()”之类的方式检查用户是否使用 Linkedin(或任何社交帐户)登录。也就是说,并不是我不能实现这个功能,而是即使我使用了一个愚蠢的条件,我也知道“email_confirmed”字段是真的
提前非常感谢。我很感激你的时间。PS。我是 Django 的菜鸟,但我很喜欢它。
模型.py
class CustomUser(AbstractUser):
id = models.BigAutoField(primary_key=True)
email = models.EmailField(unique=True)
email_confirmed = models.BooleanField(default=False)
country = models.CharField(max_length=30,choices=COUNTRY, null=True, blank=False)
first_name = models.CharField(max_length=50, null=False, blank=False, default="")
last_name = models.CharField(max_length=50, null=False, blank=False, default="")
视图.py
class SignUpView(CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('home')
template_name = 'signup.html'
...
class UpdateProfileView(UpdateView):
form_class = CustomUserChangeForm
success_url = reverse_lazy('home')
template_name = 'update_profile.html'
def get_object(self, queryset=None):
return self.request.user
表格.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
fields = ('first_name', 'last_name','country',)
class CustomUserChangeForm(UserChangeForm):
password = None
class Meta:
model = CustomUser
fields = ('first_name', 'last_name','country',)
update_profile.html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Home{% endblock title %}
{% block content %}
{% if user.is_authenticated %}
<h2>Update Profile</h2>
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-success" type="submit">Update</button>
</form>
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">Log In</a> |
<a href="{% url 'signup' %}">Sign Up</a>
{% endif %}
{% endblock content %}
My main attempt was to adding another leg in the view (see def ChangeActiveStatus below).
class UpdateProfileView(UpdateView):
form_class = CustomUserChangeForm
success_url = reverse_lazy('home')
template_name = 'update_profile.html'
def get_object(self, queryset=None):
return self.request.user
def ChangeActiveStatus(request):
if request.method == "POST":
form = self.form_class(request.POST)
user = form.save(commit=False)
if form.is_valid() and user.social_auth.exists() == True:
user.email_confirmed = True
form.save()
else:
form = form()
return render(request, 'login', {'form':form})
解决方案
我最终通过models.py实现了一个解决方案,基本上绕过了通过视图保存其中一个字段的任何更改的需要,即这是逻辑,每次客户更改其配置文件中的某些内容时都会触发该逻辑。
def save(self, *args, **kwargs):
try:
CustomUser.objects.latest('id').id
except:
...
...
if self.is_active == True and self.email_verified == False:
self.email_verified = True
super(CustomUser, self).save(*args, **kwargs)
def __str__(self):
return self.email
推荐阅读
- azure-sql-database - 将 MSI 令牌传递给 flyway 命令行
- google-apps-script - 如何优化我的 Google Apps 脚本使其不超过最大超时?
- gnuplot - gnuplot 5 多图对齐不向后兼容
- dataframe - DataFrame 定义是惰性求值
- javascript - 试图将一页数据传递到下一页,但不幸的是数据未显示
- javascript - 在 React 组件之间传递数据
- python - 用 x 轴在列中绘制 pandas groupby
- javascript - 在触发动作之前,有什么方法可以等待加载 Bootstrap 模式?
- css - 在网格自动行中正确设置图像样式
- go - gopls 替换整个项目中的变量