python - 如何修复 "Cant Update profile in Django"

标签 python django

我就遇到了这样的问题。该帐户可以在一定时期内将计划从免费更改为高级。当用户选择包并将其同步到数据库时,不会保存数据。我有什么错?这是代码

# 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/

相关文章:

python - 自定义 python 生成器中的 Return 和 StopIteration

python - 使用 ElementTree 访问 xml 文件中的元素和标记

python - 为什么 cross_val_predict 比 KNeighborsClassifier 的拟合慢得多?

python - 将 DEAP 结果保存到 pandas 数据框中

objective-c - 将 mod_wsgi 与 Apache 一起使用时无法导入 PyObjC CoreData 模块

python - 从 csv 文件中的 url 检索数据 - Python

python - Django休息框架: Including multiple choice fields in Serializer

python - 请求/响应中间件中的 Django 错误 - TypeError : __init__() takes 1 positional argument but 2 were given

django - 如何使用多个 ORM 查找参数获取单个模型对象

php - 对于 Django 中使用的小型且很少更改的数据,最快的缓存是什么?