【问题标题】:TypeError at /create_order/ __str__ returned non-string (type NoneType)/create_order/ __str__ 处的 TypeError 返回非字符串(NoneType 类型)
【发布时间】:2020-05-07 21:44:37
【问题描述】:

下新订单时出现错误。在与模型中的用户连接之前工作正常。当我创建一个单独的 user_page 视图并将客户模型与用户链接(从 django.contrib.auth.models 导入)时,它会出现此错误:

/create_order/ 处的类型错误 str 返回非字符串(NoneType 类型)

视图中的代码

@login_required(login_url='login')
def user_page(request):
    orders=Customer.objects.filter(user=request.user)
    context={'orders':orders}
    return render(request, 'blog/user_page.html', context)

@unauthenticated_user
def registration_page(request):
    if request.method=='POST':
        form=CreationUserForm(request.POST)
        if form.is_valid():
            user=form.save()

            group=Group.objects.get(name='customer')
            user.groups.add(group)
            Customer.objects.create(
                user=user,
            )



            return redirect('login')

    else:
        form=CreationUserForm()

    return render(request, 'blog/registration.html', {'form':form})


@login_required(login_url='login')
@admin_only
def home_page(request):
    orders=Order.objects.all()
    customer_data=Customer.objects.all()
    total_orders=orders.count()
    pending=Order.objects.filter(status='PENDING')
    total_pending=pending.count()
    out = orders.filter(status='OUTFORDELIEVERY')
    total_out = out.count()
    delievered = orders.filter(status='DELIEVERED')
    total_delievered = delievered.count()
    context={'orders':orders, 'customer_data':customer_data, 'total_orders':total_orders, 'total_pending': total_pending,
    'total_out':total_out, 'total_delievered':total_delievered}
    return render(request, 'blog/home_page.html', context)



@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def product_page(request):
    return render(request, 'blog/product.html')




@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def customer_page(request, id):
    customer=Customer.objects.get(id=id)

    orders=customer.order_set.all()
    total_orders=orders.count()
    myFilter=OrderFilter(request.GET, queryset=orders)
    orders=myFilter.qs
    context={'customer':customer, 'total_orders':total_orders, 'orders':orders, 'myFilter':myFilter}
    return render(request, 'blog/customer.html', context)


@login_required(login_url='login')
def create_order(request):
    if request.method=='POST':
        form=CustomerForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        form=CustomerForm()
    context={'form':form}
    return render(request, 'blog/new_order.html', context)

模型中的代码

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Customer(models.Model):
    user=models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    name=models.CharField(max_length=200, null=True)
    email=models.EmailField()
    phone=models.IntegerField(null=True)
    date_created=models.DateTimeField(auto_now_add=True, null=True)
    def __str__(self):
        return self.name

class Tag(models.Model):
    name=models.CharField(max_length=200, null=True)
    def __str__(self):
        return self.name

class Product(models.Model):
    name=models.CharField(max_length=200, null=True)
    CATEGORY=(
        ('INDOOR','INDOOR'),
        ('OUTDOOR','OUTDOOR')
    )
    category=models.CharField(max_length=200, null=True, choices=CATEGORY)
    date_created=models.DateTimeField(auto_now_add=True, null=True)
    price=models.CharField(max_length=200, null=True)


    tag=models.ManyToManyField(Tag)

class Order(models.Model):
    customer=models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL)
    product=models.ForeignKey(Product, null=True, on_delete=models.SET_NULL)
    date_created=models.DateTimeField(auto_now_add=True, null=True)
    STATUS=(
        ('PENDING','PENDING'),
        ('OUTFORDELIEVERY','OUTFORDELIEVERY'),
        ('DELIEVERED','DELIEVERED')
    )
    status=models.CharField(max_length=200, choices=STATUS,  null=True)
    note=models.CharField(max_length=200, null=True)
    order_no=models.CharField(max_length=200, null=True)

【问题讨论】:

  • 如果有人知道这个错误,请提供帮助。
  • 您可能在某处(不在此处)有一个__str__,而没有有一个return(例如因为您忘记了)。

标签: django


【解决方案1】:

请编辑您的“str”函数,这样如果您的模型中没有设置名称,它可以返回 None。

尝试以下代码(在两种型号上):

def __str__(self):
    return self.name if self.name else ''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2021-11-09
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多