gpt4 book ai didi

django - 如何正确创建覆盖 save() 方法的相关对象?

转载 作者:行者123 更新时间:2023-12-02 08:06:51 24 4
gpt4 key购买 nike

我正在重写 UserCreationForm 子类上的 save() 方法。我这样做是因为我想在创建 User 对象时创建另一个相关对象。
这是表单以及保存方法:

class MyUserCreationForm(UserCreationForm):

error_message = UserCreationForm.error_messages.update({
'duplicate_username': 'This username has already been taken.'
})

class Meta(UserCreationForm.Meta):
model = User

def clean_username(self):
username = self.cleaned_data["username"]
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate_username'])

def save(self, commit=True):
user = super(MyUserCreationForm, self).save(commit=False)
if commit:
user.save()
Profile.objects.create(user=user)
return user

因此 Profile 对象永远不会被创建。从技术上讲,如果我像这样删除 if commit: ,我就可以让它工作:

    def save(self, commit=True):
user = super(MyUserCreationForm, self).save(commit=False)
user.save()
Profile.objects.create(user=user)
return user

但是我想知道为什么每次创建用户时都会将 False 传递给 save() 方法。根据我所读到的内容,条件应该存在,以便保留与重写的 save() 方法相同的行为。

最佳答案

commit=False 旨在在内联表单中使用。它用于将父键分配给表单实例并稍后保存该实例。

来源:https://github.com/django/django/blob/master/django/forms/models.py#L942

您应该能够稍微调整您的解决方案。

def save(self, *args, **kwargs):
user = super(MyUserCreationForm, self).save(*args, **kwargs)
if user.pk: # If user object has been saved to the db
Profile.objects.get_or_create(user=user)
return user

但我建议使用 Django 的模型信号。

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def user_created_signal_handler(request, user, *args, **kwargs):
Profile.objects.get_or_create(user=user)

https://docs.djangoproject.com/en/2.0/ref/signals/#django.db.models.signals.post_save

关于django - 如何正确创建覆盖 save() 方法的相关对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47869130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com