我就遇到了这样的问题。该帐户可以在一定时期内将计划从免费更改为高级。当用户选择包并将其同步到数据库时,不会保存数据。我有什么错?这是代码
# model.py
CHOICES = [('Free', 'free'), ('Premium', 'premium')]
class MemberShip(models.Model):
title = models.CharField("Title", max_length=100)
period = models.IntegerField("Period", default=30)
price = models.IntegerField("Price", default=2, help_text="Price in dollars")
def __str__(self):
return f'Plan - {self.title}'
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
status = models.CharField("Status", max_length=20, choices=CHOICES, default='Free')
end_date = models.DateTimeField("End Date", blank=True, null=True)
membership = models.ForeignKey(MemberShip, on_delete=models.SET_NULL, null=True, default=None)
def __str__(self):
return self.user.username
# def get_absolute_url(self):
# return reverse('account:profile', args=['id', self.id])
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
# form.py
class PremiumForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['membership']
# view.py
class GetPremium(LoginRequiredMixin, UpdateView):
model = Profile
form_class = PremiumForm
template_name = 'account/premium.html'
success_url = reverse_lazy('account:dashboard')
def get_object(self, **kwargs):
return get_object_or_404(User, pk=self.request.user.id)
最佳答案
在您的get_object
中,您使用了错误的模型:您在这里需要一个Profile
对象,而不是一个User
对象:
class GetPremium(LoginRequiredMixin, UpdateView):
model = Profile
form_class = PremiumForm
template_name = 'account/premium.html'
success_url = reverse_lazy('account:dashboard')
def get_object(self, **kwargs):
return <b>get_object_or_404(Profile, user=self.request.user)</b>
请注意,对于 Profile
,您的 reverse(..)
应在此处传递一个 kwargs=...
参数,其键为 'id'
映射到您的个人资料
的 ID:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
status = models.CharField("Status", max_length=20, choices=CHOICES, default='Free')
end_date = models.DateTimeField("End Date", blank=True, null=True)
membership = models.ForeignKey(MemberShip, on_delete=models.SET_NULL, null=True, default=None)
def __str__(self):
return self.user.username
def get_absolute_url(self):
return reverse('account:profile', <b>kargs={'id': self.id}</b>)
关于python - 如何修复 "Cant Update profile in Django",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57476101/