[英]Django value error. model field must be an instance
测试地址模型时出现错误。 该用户假设在计费之前输入地址信息,但它产生一个值错误,指出地址模型中的计费字段必须是计费模型的一个实例。 这不应该是因为我已经通过外键将计费模型与寻址模型相关联。
为了清楚起见,这里是实际模型的名称: BillingProfile
和Addresses
这是产生的错误:
ValueError at /cart/checkout/address/create
Cannot assign "(<BillingProfile: romeo@gmail.com>, False)": "Address.billing_profile" must be a "BillingProfile" instance.
这是我的地址视图。 错误在第 24 行。
from django.shortcuts import render, redirect
from .forms import AddressForm
from billing.models import BillingProfile
from django.utils.http import is_safe_url
def checkout_address_create(request):
form = AddressForm(request.POST or None)
context = {
'form':form
}
next_post = request.POST.get('next')
redirect_path = next_post or None
if form.is_valid():
print(request.POST)
instance = form.save(commit=False)
billing_profile = BillingProfile.objects.new_or_get(request)
print(billing_profile)
address_type = request.POST.get('address_type', 'shipping')
if billing_profile is not None:
instance.billing_profile = billing_profile # Value error at billing
instance.address_type = address_type
instance.save()
print('Form saved')
else:
print('Error: NO billing profile')
return redirect('cart:checkout')
if is_safe_url(redirect_path, request.get_host()):
return redirect(redirect_path)
else:
return redirect('cart:checkout')
return redirect('cart:checkout')
以下是地址和计费模型。 地址:
from django.db import models
from billing.models import BillingProfile
ADDRESS_TYPES = (('billing', 'billing'),('shipping', 'shipping'))
class Address(models.Model):
billing_profile = models.ForeignKey(BillingProfile, on_delete=models.CASCADE)
country = models.CharField(max_length=120, default='Nigeria')
state = models.CharField(max_length=120)
city = models.CharField(max_length=120)
postal_code = models.CharField(max_length=120)
address_type = models.CharField(max_length=120, choices=ADDRESS_TYPES)
address_line1 = models.CharField(max_length=120)
address_line2 = models.CharField(max_length=120, null=True, blank=True)
def __str__(self):
return str(self.BillingProfile)
计费;
from django.db import models
from django.conf import settings
from django.db.models.signals import post_save
from accounts.models import Guest
User = settings.AUTH_USER_MODEL
class BillingProfileManager(models.Manager):
def new_or_get(self, request):
user = request.user
guest_email_id = request.session.get('guest_email_id')
obj = None
created = False
# Logged in user checkout. Remembers payment
if user.is_authenticated:
obj,created = self.model.objects.get_or_create(user=user, email=user.email)
# Guest user checkout. autoreloads payment
elif guest_email_id is not None:
guest_obj = Guest
guest_email_obj = guest_obj.objects.get(id=guest_email_id)
obj,created = self.model.objects.get_or_create(email=guest_email_obj.email)
created = True
else:
created = False
return obj, created
class BillingProfile(models.Model):
user = models.OneToOneField(User, unique=True, null=True, blank=True, on_delete=models.DO_NOTHING)
email = models.EmailField()
active = models.BooleanField(default=True)
update = models.DateField(auto_now=True)
timestamp = models.DateField(auto_now_add=True)
objects = BillingProfileManager()
def __str__(self):
return self.email
def user_created_reciever(sender, instance, created, *args, **kwargs):
if created and instance.email:
BillingProfile.objects.get_or_create(user=instance, email=instance.email)
post_save.connect(user_created_reciever, sender=User)
你的代码很好,需要一个简单的修复。 objects.new_or_get()
返回一个带有对象和布尔值的元组。 在您的情况下(<BillingProfile: romeo@gmail.com>, False)
。 布尔值表示该值是否是新创建的。
通过获取元组的第一个元素来修复它:
billing_profile = BillingProfile.objects.new_or_get(request)[0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.