首页 > 解决方案 > 如何使用隐藏逻辑通过 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}) 

标签: djangodjango-viewsdjango-forms

解决方案


我最终通过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

推荐阅读