#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import django
from django.conf import settings
from django.core.management import execute_from_command_line
from django.http import HttpResponse
from django.urls import path
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.db.models import Sum, Count
from django.utils import timezone
from django.template import Template, Context
# 配置Django环境
def configure_django():
if not settings.configured:
settings.configure(
DEBUG=True,
SECRET_KEY='django-insecure-^w5#*+1$s(6k7vx0c4j%!^$q@8u3g&f$1p%j)3l@8!7vx0c4j%',
ROOT_URLCONF=__name__,
DATABASES={
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'supply_chain.db',
}
},
INSTALLED_APPS=[
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
],
MIDDLEWARE=[
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
],
TEMPLATES=[
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
],
STATIC_URL='/static/',
LOGIN_URL='login',
)
django.setup()
# 先执行配置,确保Django初始化完成
configure_django()
# 配置完成后再导入模型相关模块
from django.db import models
from django.contrib.auth.models import AbstractUser
from django import forms
# 定义模型
class User(AbstractUser):
pass
class Supplier(models.Model):
name = models.CharField(max_length=100)
contact_person = models.CharField(max_length=100)
email = models.EmailField()
phone = models.CharField(max_length=20)
address = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Product(models.Model):
CATEGORY_CHOICES = [
('raw', 'Raw Material'),
('component', 'Component'),
('finished', 'Finished Product'),
]
name = models.CharField(max_length=100)
sku = models.CharField(max_length=50, unique=True)
description = models.TextField(blank=True)
category = models.CharField(max_length=20, choices=CATEGORY_CHOICES)
unit_price = models.DecimalField(max_digits=10, decimal_places=2)
supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True, related_name='products')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.name} ({self.sku})"
class Inventory(models.Model):
product = models.OneToOneField(Product, on_delete=models.CASCADE, related_name='inventory')
quantity = models.PositiveIntegerField(default=0)
low_stock_threshold = models.PositiveIntegerField(default=10)
last_updated = models.DateTimeField(auto_now=True)
@property
def status(self):
if self.quantity == 0:
return 'out-of-stock'
elif self.quantity <= self.low_stock_threshold:
return 'low-stock'
return 'in-stock'
def __str__(self):
return f"{self.product.name} - {self.quantity} units"
class PurchaseOrder(models.Model):
STATUS_CHOICES = [
('draft', 'Draft'),
('pending', 'Pending Approval'),
('approved', 'Approved'),
('shipped', 'Shipped'),
('delivered', 'Delivered'),
('cancelled', 'Cancelled'),
]
order_number = models.CharField(max_length=20, unique=True)
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE, related_name='orders')
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='orders')
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='draft')
order_date = models.DateTimeField(auto_now_add=True)
expected_delivery_date = models.DateField()
notes = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
@property
def total_value(self):
return sum(item.total_price for item in self.items.all())
def __str__(self):
return f"PO-{self.order_number}"
class PurchaseOrderItem(models.Model):
order = models.ForeignKey(PurchaseOrder, on_delete=models.CASCADE, related_name='items')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
unit_price = models.DecimalField(max_digits=10, decimal_places=2)
@property
def total_price(self):
return self.quantity * self.unit_price
def __str__(self):
return f"{self.product.name} x {self.quantity}"
# 定义表单
class LoginForm(forms.Form):
username = forms.CharField(
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Username'
})
)
password = forms.CharField(
widget=forms.PasswordInput(attrs={
'class': 'form-control',
'placeholder': 'Password'
})
)
class SupplierForm(forms.ModelForm):
class Meta:
model = Supplier
fields = ['name', 'contact_person', 'email', 'phone', 'address']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control'}),
'contact_person': forms.TextInput(attrs={'class': 'form-control'}),
'email': forms.EmailInput(attrs={'class': 'form-control'}),
'phone': forms.TextInput(attrs={'class': 'form-control'}),
'address': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
}
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'sku', 'description', 'category', 'unit_price', 'supplier']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control'}),
'sku': forms.TextInput(attrs={'class': 'form-control'}),
'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
'category': forms.Select(attrs={'class': 'form-control'}),
'unit_price': forms.NumberInput(attrs={'class': 'form-control'}),
'supplier': forms.Select(attrs={'class': 'form-control'}),
}
class InventoryForm(forms.ModelForm):
class Meta:
model = Inventory
fields = ['product', 'quantity', 'low_stock_threshold']
widgets = {
'product': forms.Select(attrs={'class': 'form-control'}),
'quantity': forms.NumberInput(attrs={'class': 'form-control'}),
'low_stock_threshold': forms.NumberInput(attrs={'class': 'form-control'}),
}
class PurchaseOrderForm(forms.ModelForm):
class Meta:
model = PurchaseOrder
fields = ['supplier', 'expected_delivery_date', 'notes']
widgets = {
'supplier': forms.Select(attrs={'class': 'form-control'}),
'expected_delivery_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
}
class PurchaseOrderItemForm(forms.ModelForm):
class Meta:
model = PurchaseOrderItem
fields = ['product', 'quantity', 'unit_price']
widgets = {
'product': forms.Select(attrs={'class': 'form-control'}),
'quantity': forms.NumberInput(attrs={'class': 'form-control'}),
'unit_price': forms.NumberInput(attrs={'class': 'form-control'}),
}
# 视图函数
def login_view(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
messages.success(request, f"Welcome back, {user.username}!")
return redirect('dashboard')
messages.error(request, "Invalid username or password.")
else:
form = LoginForm()
return render(request, 'login.html', {'form': form})
@login_required
def logout_view(request):
logout(request)
messages.info(request, "You have been logged out.")
return redirect('login')
@login_required
def dashboard(request):
# Inventory summary
inventory_status = Inventory.objects.values('status').annotate(
count=Count('id'),
total_quantity=Sum('quantity')
)
# Purchase order status
order_status = PurchaseOrder.objects.values('status').annotate(
count=Count('id'),
total_value=Sum('items__total_price')
)
# Recent orders
recent_orders = PurchaseOrder.objects.select_related('supplier').order_by('-order_date')[:5]
# Low stock items
low_stock = Inventory.objects.filter(status='low-stock').select_related('product')[:5]
context = {
'inventory_status': inventory_status,
'order_status': order_status,
'recent_orders': recent_orders,
'low_stock': low_stock,
}
return render(request, 'dashboard.html', context)
# Supplier Views
@login_required
def supplier_list(request):
suppliers = Supplier.objects.all().order_by('name')
return render(request, 'suppliers.html', {'suppliers': suppliers})
@login_required
def supplier_create(request):
if request.method == 'POST':
form = SupplierForm(request.POST)
if form.is_valid():
supplier = form.save()
messages.success(request, f'Supplier "{supplier.name}" created successfully.')
return redirect('supplier_list')
else:
form = SupplierForm()
return render(request, 'supplier_form.html', {'form': form, 'action': 'Create'})
@login_required
def supplier_edit(request, pk):
supplier = get_object_or_404(Supplier, pk=pk)
if request.method == 'POST':
form = SupplierForm(request.POST, instance=supplier)
if form.is_valid():
supplier = form.save()
messages.success(request, f'Supplier "{supplier.name}" updated successfully.')
return redirect('supplier_list')
else:
form = SupplierForm(instance=supplier)
return render(request, 'supplier_form.html', {'form': form, 'action': 'Edit'})
@login_required
def supplier_delete(request, pk):
supplier = get_object_or_404(Supplier, pk=pk)
if request.method == 'POST':
supplier_name = supplier.name
supplier.delete()
messages.success(request, f'Supplier "{supplier_name}" deleted successfully.')
return redirect('supplier_list')
return render(request, 'supplier_confirm_delete.html', {'supplier': supplier})
# Product Views
# Product Views
@login_required
def product_list(request):
products = Product.objects.select_related('supplier').all().order_by('name')
return render(request, 'products.html', {'products': products})
@login_required
def product_create(request):
if request.method == 'POST':
form = ProductForm(request.POST)
if form.is_valid():
product = form.save()
# Create inventory record for new product
Inventory.objects.create(product=product, quantity=0)
messages.success(request, f'Product "{product.name}" created successfully.')
return redirect('product_list')
else:
form = ProductForm()
return render(request, 'product_form.html', {'form': form, 'action': 'Create'})
@login_required
def product_edit(request, pk):
product = get_object_or_404(Product, pk=pk)
if request.method == 'POST':
form = ProductForm(request.POST, instance=product)
if form.is_valid():
product = form.save()
messages.success(request, f'Product "{product.name}" updated successfully.')
return redirect('product_list')
else:
form = ProductForm(instance=product)
return render(request, 'product_form.html', {'form': form, 'action': 'Edit'})
@login_required
def product_delete(request, pk):
product = get_object_or_404(Product, pk=pk)
if request.method == 'POST':
product_name = product.name
product.delete()
messages.success(request, f'Product "{product_name}" deleted successfully.')
return redirect('product_list')
return render(request, 'product_confirm_delete.html', {'product': product})
# Inventory Views
@login_required
def inventory_list(request):
inventory = Inventory.objects.select_related('product').all().order_by('product__name')
return render(request, 'inventory.html', {'inventory': inventory})
@login_required
def inventory_edit(request, pk):
inventory = get_object_or_404(Inventory, pk=pk)
if request.method == 'POST':
form = InventoryForm(request.POST, instance=inventory)
if form.is_valid():
form.save()
messages.success(request, f'Inventory for "{inventory.product.name}" updated successfully.')
return redirect('inventory_list')
else:
form = InventoryForm(instance=inventory)
return render(request, 'inventory_form.html', {'form': form, 'action': 'Edit'})
# Purchase Order Views
@login_required
def purchase_order_list(request):
orders = PurchaseOrder.objects.select_related('supplier').all().order_by('-order_date')
return render(request, 'purchase_orders.html', {'orders': orders})
@login_required
def purchase_order_create(request):
if request.method == 'POST':
form = PurchaseOrderForm(request.POST)
if form.is_valid():
order = form.save(commit=False)
order.created_by = request.user
order.save()
messages.success(request, f'Purchase order created successfully. Now add items.')
return redirect('purchase_order_detail', pk=order.pk)
else:
form = PurchaseOrderForm()
return render(request, 'purchase_order_form.html', {'form': form, 'action': 'Create'})
@login_required
def purchase_order_detail(request, pk):
order = get_object_or_404(PurchaseOrder.objects.prefetch_related('items__product'), pk=pk)
items = order.items.all()
if request.method == 'POST':
item_form = PurchaseOrderItemForm(request.POST)
if item_form.is_valid():
item = item_form.save(commit=False)
item.order = order
item.save()
messages.success(request, 'Item added to order.')
return redirect('purchase_order_detail', pk=order.pk)
else:
item_form = PurchaseOrderItemForm()
return render(request, 'order_detail.html', {
'order': order,
'items': items,
'item_form': item_form
})
@login_required
def purchase_order_edit(request, pk):
order = get_object_or_404(PurchaseOrder, pk=pk)
if request.method == 'POST':
form = PurchaseOrderForm(request.POST, instance=order)
if form.is_valid():
form.save()
messages.success(request, 'Purchase order updated successfully.')
return redirect('purchase_order_detail', pk=order.pk)
else:
form = PurchaseOrderForm(instance=order)
return render(request, 'purchase_order_form.html', {'form': form, 'action': 'Edit'})
@login_required
def purchase_order_delete(request, pk):
order = get_object_or_404(PurchaseOrder, pk=pk)
if request.method == 'POST':
order_number = order.order_number
order.delete()
messages.success(request, f'Purchase order {order_number} deleted successfully.')
return redirect('purchase_order_list')
return render(request, 'purchase_order_confirm_delete.html', {'order': order})
@login_required
def purchase_order_update_status(request, pk, status):
order = get_object_or_404(PurchaseOrder, pk=pk)
valid_statuses = [choice[0] for choice in PurchaseOrder.STATUS_CHOICES]
if status in valid_statuses:
order.status = status
order.save()
# If delivered, update inventory
if status == 'delivered':
for item in order.items.all():
inventory, created = Inventory.objects.get_or_create(product=item.product)
inventory.quantity += item.quantity
inventory.save()
messages.success(request, f'Order status updated to {status.capitalize()}.')
else:
messages.error(request, 'Invalid status provided.')
return redirect('purchase_order_detail', pk=order.pk)
@login_required
def purchase_order_item_delete(request, pk):
item = get_object_or_404(PurchaseOrderItem, pk=pk)
order_pk = item.order.pk
if request.method == 'POST':
item.delete()
messages.success(request, 'Item removed from order.')
return redirect('purchase_order_detail', pk=order_pk)
# 模板渲染函数
def render_template(template_name, context=None, request=None):
templates = {
'base.html': BASE_TEMPLATE,
'login.html': LOGIN_TEMPLATE,
'dashboard.html': DASHBOARD_TEMPLATE,
'suppliers.html': SUPPLIERS_TEMPLATE,
'supplier_form.html': SUPPLIER_FORM_TEMPLATE,
'supplier_confirm_delete.html': SUPPLIER_DELETE_TEMPLATE,
'products.html': PRODUCTS_TEMPLATE,
'product_form.html': PRODUCT_FORM_TEMPLATE,
'product_confirm_delete.html': PRODUCT_DELETE_TEMPLATE,
'inventory.html': INVENTORY_TEMPLATE,
'inventory_form.html': INVENTORY_FORM_TEMPLATE,
'purchase_orders.html': PURCHASE_ORDERS_TEMPLATE,
'purchase_order_form.html': PURCHASE_ORDER_FORM_TEMPLATE,
'order_detail.html': ORDER_DETAIL_TEMPLATE,
'purchase_order_confirm_delete.html': PURCHASE_ORDER_DELETE_TEMPLATE,
}
if template_name not in templates:
return HttpResponse(f"Template {template_name} not found", status=404)
template = Template(templates[template_name])
context = context or {}
context['request'] = request
context['messages'] = messages.get_messages(request) if request else []
return HttpResponse(template.render(Context(context)))
# URL配置
urlpatterns = [
# Authentication
path('login/', login_view, name='login'),
path('logout/', logout_view, name='logout'),
# Dashboard
path('dashboard/', dashboard, name='dashboard'),
# Suppliers
path('suppliers/', supplier_list, name='supplier_list'),
path('suppliers/create/', supplier_create, name='supplier_create'),
path('suppliers/edit/<int:pk>/', supplier_edit, name='supplier_edit'),
path('suppliers/delete/<int:pk>/', supplier_delete, name='supplier_delete'),
# Products
path('products/', product_list, name='product_list'),
]
为什么这个代码没办法运行?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
檀越@新空间 2025-08-09 20:42关注晚上好🌙🌙🌙
本答案参考通义千问你的代码看起来是一个 Django 应用程序的脚本,但存在一些问题,导致它无法正常运行。下面我将详细分析原因,并提供解决方案。
✅ 一、代码无法运行的原因
1. 代码未完成
你提供的代码在
Inventory模型中被截断,没有完整地定义字段:class Inventory(models.Model): product = models.OneToOneField(Product, on_delete=models.CASCADE, related_name='inventory') quantity = models.PositiveI这里
PositiveI是不完整的,应该是PositiveIntegerField。这个错误会导致 Python 报错,因为模型定义不合法。
2. 未定义视图和 URL 路由
虽然你导入了
HttpResponse,path,render,redirect等 Django 功能,但没有定义任何实际的视图函数或 URL 路由。这意味着即使配置正确,也没有可以访问的页面。
3. 未执行启动命令
你使用了
execute_from_command_line(),但并没有调用它。也就是说,没有启动 Django 的开发服务器或执行管理命令。
4. 未创建数据库文件
虽然你设置了 SQLite 数据库为
supply_chain.db,但如果没有运行迁移命令(如migrate),数据库表不会被创建,可能导致后续操作失败。
5. 未设置正确的环境变量
虽然你在
configure_django()中设置了DEBUG=True,但在某些环境中(如生产环境)可能需要额外的配置,例如DJANGO_SETTINGS_MODULE。
✅ 二、解决方案
1. 完善模型定义
将
Inventory模型补全:class Inventory(models.Model): product = models.OneToOneField(Product, on_delete=models.CASCADE, related_name='inventory') quantity = models.PositiveIntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f"{self.product.name} - {self.quantity}"
2. 添加视图和 URL 路由
添加一个简单的视图并定义路由:
def index(request): return HttpResponse("Hello, this is the Django app!") urlpatterns = [ path('', index, name='index'), ]
3. 执行 Django 命令
在最后添加以下代码来启动 Django 开发服务器:
if __name__ == "__main__": execute_from_command_line(sys.argv)
4. 创建数据库
确保你运行了 Django 的迁移命令,可以通过以下方式:
python manage.py migrate但注意:这通常是在 Django 项目结构中通过
manage.py运行的。如果你是直接运行该脚本,建议不要直接运行migrate,而是构建一个完整的 Django 项目结构。
5. 设置环境变量(可选)
如果你在某些环境下运行,可以设置:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings")
✅ 三、修改后的完整代码示例
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import django from django.conf import settings from django.core.management import execute_from_command_line from django.http import HttpResponse from django.urls import path # 配置Django环境 def configure_django(): if not settings.configured: settings.configure( DEBUG=True, SECRET_KEY='django-insecure-^w5#*+1$s(6k7vx0c4j%!^$q@8u3g&f$1p%j)3l@8!7vx0c4j%', ROOT_URLCONF=__name__, DATABASES={ 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'supply_chain.db', } }, INSTALLED_APPS=[ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ], MIDDLEWARE=[ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ], TEMPLATES=[ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ], STATIC_URL='/static/', LOGIN_URL='login', ) django.setup() # 先执行配置,确保Django初始化完成 configure_django() # 定义模型 from django.db import models class User(models.Model): pass class Supplier(models.Model): name = models.CharField(max_length=100) contact_person = models.CharField(max_length=100) email = models.EmailField() phone = models.CharField(max_length=20) address = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class Product(models.Model): CATEGORY_CHOICES = [ ('raw', 'Raw Material'), ('component', 'Component'), ('finished', 'Finished Product'), ] name = models.CharField(max_length=100) sku = models.CharField(max_length=50, unique=True) description = models.TextField(blank=True) category = models.CharField(max_length=20, choices=CATEGORY_CHOICES) unit_price = models.DecimalField(max_digits=10, decimal_places=2) supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True, related_name='products') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f"{self.name} ({self.sku})" class Inventory(models.Model): product = models.OneToOneField(Product, on_delete=models.CASCADE, related_name='inventory') quantity = models.PositiveIntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f"{self.product.name} - {self.quantity}" # 定义视图 def index(request): return HttpResponse("Hello, this is the Django app!") # 定义 URL 路由 urlpatterns = [ path('', index, name='index'), ] # 启动 Django if __name__ == "__main__": execute_from_command_line(sys.argv)
✅ 四、注意事项
- 此脚本不适合直接用于生产环境,因为它缺少完整的 Django 项目结构。
- 如果你需要真正运行 Django 应用,请使用标准的 Django 项目结构,包含
settings.py,urls.py,views.py和models.py。 - 如果你想测试数据库是否创建成功,可以在运行脚本后检查当前目录下是否有
supply_chain.db文件。
✅ 总结
| 问题 | 解决方案 | |------|----------| | 模型定义不完整 | 补全
Inventory模型 | | 缺少视图和 URL | 添加index视图和urlpatterns| | 未执行 Django 命令 | 在if __name__ == "__main__"中调用execute_from_command_line| | 未创建数据库 | 使用python manage.py migrate或确保配置正确 | | 环境变量缺失 | 设置DJANGO_SETTINGS_MODULE(可选) |
如有更多需求(比如添加用户登录、数据操作等),欢迎继续提问!
解决 无用评论 打赏 举报