Django类Fiverr项目中如何自动将卖家信息关联至订单?
解决方案
1. 修正Order模型的字段设计
你的Order模型里seller字段错误关联了Gig,应该直接关联Profile;同时需要新增gig字段关联对应的服务,这样才能通过Gig自动获取卖家信息:
class Order(models.Model): buyer = models.ForeignKey(Profile, on_delete=models.CASCADE, null=False, blank=False) gig = models.ForeignKey(Gig, on_delete=models.CASCADE, null=False, blank=False) # 新增:关联目标Gig seller = models.ForeignKey(Profile, on_delete=models.CASCADE, null=False, blank=False) # 修正:关联卖家Profile title = models.CharField(max_length=500, null=True, blank=True) description = models.CharField(max_length=500) amount = models.IntegerField(blank=False) # 注意:IntegerField无需设置max_length参数 is_ordered = models.BooleanField(default=False) order_id = models.UUIDField(default=uuid.uuid4, unique=True, db_index=True, editable=False) slug = models.SlugField(null=True) def __str__(self): return self.title
2. 调整URL路由,传递Gig ID
在项目的urls.py中新增订单创建路由,接收gig_id参数:
path('create-order/<uuid:gig_id>/', createOrder, name='create_order'),
3. 修改视图函数,自动关联Gig与卖家
从URL中获取gig_id,查询对应Gig后自动填充订单的卖家和Gig信息,无需买家手动选择:
def createOrder(request, gig_id): try: gig = Gig.objects.get(gig_id=gig_id) except Gig.DoesNotExist: messages.error(request, '对应的服务不存在') return redirect('gigs_list') # 跳转到服务列表页 profile = request.user.profile form = CreateOrderForm() if request.method == 'POST': form = CreateOrderForm(request.POST) if form.is_valid(): # 注意这里要加括号调用方法 order = form.save(commit=False) order.buyer = profile order.gig = gig # 关联选中的Gig order.seller = gig.seller # 自动从Gig获取卖家信息 order.title = gig.title # 自动填充订单标题为Gig标题 order.save() messages.info(request, '订单创建成功') return redirect('order_detail', order_id=order.order_id) # 跳转到订单详情页 else: messages.error(request, '订单创建失败,请检查输入') context = {'form':form, 'gig': gig} return render(request, 'users/create_order.html', context)
4. 调整表单,隐藏无需手动输入的字段
在forms.py中,只保留需要买家填写的字段,排除或隐藏自动填充的字段:
from django import forms from .models import Order class CreateOrderForm(forms.ModelForm): class Meta: model = Order fields = ['description', 'amount'] # 仅保留买家需要输入的内容 # 也可以用exclude写法:exclude = ['buyer', 'gig', 'seller', 'title', 'is_ordered', 'order_id', 'slug']
5. 在Gig详情页添加下单入口
在Gig详情页面(如gig_detail.html)中,添加指向订单创建页的按钮,自动传递当前Gig的ID:
<a href="{% url 'create_order' gig_id=gig.gig_id %}" class="btn btn-primary">立即下单</a>
这样买家浏览Gig详情时,点击下单按钮即可进入订单创建页,系统自动关联该Gig的卖家信息,完全不需要手动选择Gig,解决了效率问题。
内容的提问来源于stack exchange,提问作者KipronoKirui
相关产品推荐
相关产品推荐

