为什么我得到Django表单:关键错误



我正在创建一个创建一个拍卖管理系统,我打算在其中添加竞标功能,知道我正面临这个错误

我正在高亮显示我得到错误的行

view.py

class ItemDetailView(CreateView):
template_name = "itemdetail.html"
form_class = BidOnProduct
success_url = reverse_lazy("auction:item_detail")
def dispatch(self, request, *args, **kwargs):
buyer_id = request.session.get("id")
buyer_obj = Buyer.objects.filter(id=buyer_id)
if buyer_obj:
pass
else:
return redirect("auction:buyer_login")
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
item = Item.objects.get(slug=kwargs["slug"])
bids = Bid.objects.filter(item=item)
context["item"] = item
context["bids"] = bids
return context
def form_valid(self, form):
buyer_id = self.request.session.get("id")
if buyer_id:
buyer_obj = Buyer.objects.get(id=buyer_id)
form.instance.buyer = buyer_obj
form.instance.item = Item.objects.get(slug=self.kwargs["slug"])
form.save()
return redirect("auction:buyerhome")
return super().form_valid(form)

form.py

class BidOnProduct(forms.ModelForm):
class Meta:
model = Bid
fields = ["price"]

Model.py

class Bid(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateField(auto_now_add=True)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
price = models.IntegerField()
biding_time = models.DateTimeField(auto_now_add=True, null=True)
def __str__(self):
return self.user.username

htmlcode

{% if request.user.buyer %}
<form class="form-horizontal" action="" method="post"">
{% csrf_token %}
{{form.as_p}}
<button class=" btn btn-info"> Add product</button>
</form>
{%endif%}

这是错误

这一行是

Url.py

path("item/<slug:slug>/", ItemDetailView.as_view(), name="item_detail"),

ItemDetailView中,您有:

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
item = Item.objects.get(slug=kwargs["slug"])  # Error line
bids = Bid.objects.filter(item=item)
context["item"] = item
context["bids"] = bids
return context

在有错误的行中,您正在访问传递给get_context_data的kwargs。它与self.kwargs(来自URL的kwargs)不同,这些kwargs只是用所有传递的值更新上下文的快捷方式。您需要使用self.kwargs:

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
item = Item.objects.get(slug=self.kwargs["slug"])  # Here
bids = Bid.objects.filter(item=item)
context["item"] = item
context["bids"] = bids
return context

最新更新