django - 在项目中更新用户模型我应该如何编写视图以将数据保存到配置文件模型
问题描述
我正在尝试模仿本教程,特别是为用户创建个人资料:https ://ruddra.com/posts/django-custom-user-migration-mid-phase-project/
但是,我无法让它工作,如何编写视图以将表单输入保存到 Profile 模型中。从屏幕截图中,您可以看到 first_name、last_name 等没有从表单输入中保存,即使它们是必填字段。在没有任何输入信息的情况下创建了用户“ddkl”。我尝试输入“John”、“Smith”、“90210”等,但没有从表单中保存。编辑:弄清楚它正在将字段保存到核心用户模型。任何想法如何让它也保存到个人资料。
Django 版本 == 2.2.3。发现无法使用 get_profile(),而是尝试使用信号:@receiver(post_save, sender=User)。
这是我的个人资料模型:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
key = models.CharField(max_length=25, null=True, blank=True)
first_name = models.CharField(max_length=25)
last_name = models.CharField(max_length=25)
address1 = models.CharField(null=True, max_length=100, blank=True)
address2 = models.CharField(null=True, max_length=100, blank=True, default="")
zipcode = models.CharField(max_length=10, null=True, blank=True,
help_text="zipcode")
state = models.CharField(null=True, max_length=2, blank=True)
email = models.EmailField(max_length = 250, unique=True,
verbose_name = 'email_address')
username = models.CharField(max_length = 25)
password = models.CharField(max_length =25, null=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, omstamce, created, **kwargs):
if created:
Profile.objects.create(user=instance)
def __str__(self):
return f'{self.first_name} ({self.last_name}) ({self.email})'
这是我的views.py。它不起作用,我似乎无法将此模型保存到配置文件。
def payments(request):
if request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
profile = form.save(commit=False)
# WHAT SHOULD I DO HERE TO SAVE TO PROFILE MODEL
profile.user = request.user
profile.key = "".join(random.choice(string.digits) for i in range(20))
profile.save()
messages.success(request, f'Your account has been created! Please proceed to agreements and payment.')
return redirect('agreements_page')
else:
form = CustomUserCreationForm(request.POST)
return render(request, 'premium/payments.html', {'form': form})
这是我的forms.py:
Profile = get_user_model()
class CustomUserCreationForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['first_name', 'last_name', 'email', 'zipcode', 'username']
def clean_password(self):
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords do not match")
return password2
def save(self, commit=True):
user = super(CustomUserCreationForm, self).save(commit=False)
user.username = self.cleaned_data['username']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.zipcode = self.cleaned_data['zipcode']
user.email = self.cleaned_data['email']
user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user
基本上,我需要帮助重写我评论的部分视图。
问题截图:数据不会保存,如电子邮件、名字、姓氏。
编辑:我应该指定模型吗?或者,还有更好的方法:
Profile.objects.create(user=profile.user, first_name=form.cleaned.data['first_name'],...)
解决方案
推荐阅读
- python - 在元类中“解包”并再次包装@staticmethod
- google-cloud-platform - 错误:(gcloud.sql.connect)HTTPError 400:传入请求包含无效数据
- javascript - 如何使用 Angular 6 动态创建 html 表
- c++ - 在循环进入期间,for 循环中的 C++ 分段错误
- python - Python 随机数组排序
- ruby - 为什么 jekyll 站点生成器中不显示文本?
- excel - 如何创建 VBA 用户界面以创建基于不同 KPI 的图表
- python-3.x - 无法安装 pycrypto
- android - FirebaseUI,RecyclerView,创建未知子的引用
- html - 当我使用 #element:target #otherelement 时它不起作用