Почему я получаю форму 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"]
<
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
В строке с ошибкой вы обращаетесь к kwargs, которые передаются в get_context_data
. Это не то же самое, что self.kwargs
(kwargs из URL), эти 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