Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:UpdateView具有唯一字段_Python_Django - Fatal编程技术网

Python Django:UpdateView具有唯一字段

Python Django:UpdateView具有唯一字段,python,django,Python,Django,我正在尝试为我的自定义用户模型创建更新配置文件页面。在我的模型中,我的电子邮件字段设置为唯一 class User(UserBase): ... email = models.EmailField( max_length=100, unique=True, blank=True, verbose_name='email address', ) 在我看来,我有: c

我正在尝试为我的自定义用户模型创建更新配置文件页面。在我的模型中,我的电子邮件字段设置为唯一

class User(UserBase):
     ...
     email = models.EmailField(
            max_length=100,
            unique=True,
            blank=True,
            verbose_name='email address',
        )
在我看来,我有:

class UpdateProfileView(LoginRequiredMixin, UpdateView):
    template_name = 'accounts/update-profile.html'
    form_class = UpdateProfileForm
    model = User
UpdateProfileForm
唯一要做的就是在
clean
方法中检查旧密码与新密码是否不同

我的问题是,当我保存表单时,收到的错误消息是带有此电子邮件地址的用户已存在。。既然它是一个更新视图,并且保存了一个唯一的字段,但没有更改,那么它不应该抛出这个错误吗?如果这是正确的行为,那么如何保存表单并忽略电子邮件地址(如果没有更改)


提前感谢您的帮助。

以下是一些建议/备选方案:

  • 如果停止使用泛型视图(即UpdateProfileView),则可以在逻辑视图中执行以下步骤:如果请求是POST,则从表单中获取数据并更新模型()

  • 为什么不改用模型形式呢

  • 为什么不使用来自django.contrib.auth.models的用户

  • 最后,您是否考虑过使用这个已经构建好的Django注册应用程序

  • 永远不要使用blank=True和unique=True,这是毫无意义的。如果您想使此字段在表单中不是必需的,只需这样做即可

    class Form(forms.Form):
         ...
    
         def __init__(self, *args, **kwargs):
              super().__init__(*args, **kwargs)
              self.fields['unique_field].required = False 
    
  • 除了前面的答案,当你使用blank=True和unique=True时,“Is ready exits…blah bla”是正确的行为,因为表单接受空字符串作为值,并且它已经存在。您需要重写clean_字段方法:

    class Form(forms.Form):
        ...
    
        def clean_unique_id(self):
            """
            Take new value or if its '' e.g. None take initial value 
            """
            return self.data['unique_id'] or self.initial['unique_id']
    

  • 从用户模型定义中删除
    blank=True
    。默认情况下,字段定义为
    null=False
    ,此外,您还指定该字段必须唯一。这是一个重要字段,因此您不希望表单验证允许空白值。下面是关于这些属性的Django<代码>空白完全是表单验证。仅此一点就可以修复错误

    除非您有自定义表单逻辑/验证,否则在
    UpdateProfileView
    上不需要
    form\u类
    属性。来自:“这些通用视图将自动创建模型表单”。(甚至还有一个UpdateView示例)


    查看视图在没有
    form\u类的情况下是否有效,如果有效,然后检查您的
    UpdateProfileForm
    代码。

    我正在服用疯狂药丸吗,这不是一个问题还是一个愚蠢的问题?没有人对此有任何反馈?为什么不给我们看一下
    UpdateProfileForm
    ,这样我们就可以得到更好的想法。直接从
    表单。save
    :“ModelForm的子类可以接受现有的模型实例作为关键字参数实例;如果提供了它,save()将更新该实例。如果未提供该实例,则save()将创建指定模型的新实例。“是否使用
    实例
    参数?在注释掉
    表单类
    时是否有效?”?