繁体   English   中英

Django 值错误。 模型字段必须是一个实例

[英]Django value error. model field must be an instance

测试地址模型时出现错误。 该用户假设在计费之前输入地址信息,但它产生一个值错误,指出地址模型中的计费字段必须是计费模型的一个实例。 这不应该是因为我已经通过外键将计费模型与寻址模型相关联。

为了清楚起见,这里是实际模型的名称: BillingProfileAddresses

这是产生的错误:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM