python - Django ModelForm 没有检索字段的值
问题描述
我正在使用两个 ModelForms 来创建具有 Profile 实例的用户。Profile ModelForm 有一个字段。我正在做 form.save(commit=False),设置表单中的必填字段(国家)以外的字段并保存。我收到一条错误消息,提示“country_id”不能为空。
模型.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
country = models.ForeignKey(Country, on_delete=models.CASCADE)
bio = models.TextField(blank=True)
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
email_confirmed = models.BooleanField(default=False)
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()
表格.py
class UserRegisterForm(UserCreationForm):
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
class ProfileRegisterForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['country']
视图.py
def register(request):
if request.method == 'POST':
user_form = UserRegisterForm(request.POST)
profile_form = ProfileRegisterForm(request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save(commit=False)
user.is_active = False
profile = profile_form.save(commit=False)
profile.user = user
user.save()
current_site = get_current_site(request)
subject = 'Activate Your Account'
message = render_to_string('account_activation_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode(),
'token': account_activation_token.make_token(user)
})
user.email_user(subject, message)
return redirect('activation_email_sent')
else:
user_form = UserRegisterForm()
profile_form = ProfileRegisterForm()
return render(request, 'register.html', {'user_form': user_form, 'profile_form': profile_form})
解决方案
是的。我删除了post_save
, 使其可以为country
空user
并profile
单独保存。谢谢您的帮助。
视图.py
def register(request):
if request.method == 'POST':
user_form = UserRegisterForm(request.POST)
profile_form = ProfileRegisterForm(request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save(commit=False)
user.is_active = False
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
推荐阅读
- asp.net - 如何从后面的代码中添加 DnnCssInclude?
- python-3.x - 尽管安装了构建工具,但 Pyshark 安装仍然无法满足 Visual C++ 的要求。
- windows - 如何停止 Service Fabric 进程?
- vba - Excel VBA - 比较两个工作簿中的两个数组
- javascript - 在 setState 之后立即将状态传递给另一个组件
- node.js - 如何找出 nodejs 版本支持哪个版本的 angular-cli?
- reactjs - 如何在 Mapbox 地图上添加固定标记?(反应)
- sql - 在 SQL Server 表插入上调用 Curl 的最佳实践?
- html - 在 Ionic 3 上上传照片
- rasa-nlu - Rasa - 无法加载任何代理模型