繁体   English   中英

TypeError at '' __init__() 得到一个意外的关键字参数 ''

[英]TypeError at '' __init__() got an unexpected keyword argument ''

我正在完成一个创建简单 Django 拍卖站点的项目,并且在从“详细信息”视图创建新投标并传递相关对象(拍卖)和用户时,我无法覆盖 Django 模型表单中的init方法。

我正在尝试覆盖 BidForm(forms.modelform) init方法,以便我可以使用 kwargs.pop 传递相关的“拍卖”对象。 我收到错误 'TypeError: init () got an unexpected keyword argument 'auction''

请建议我做错了什么,并指出我正确的方向 - 提前谢谢

模型

class Bid(TimeStampMixin):
        """ Model representing a bid in an auction """
    auction = models.ForeignKey(
        Listing, 
        on_delete=models.SET_NULL, 
        related_name='offer', 
        null=True)
    bidder = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete=models.SET_NULL, 
        null=True,
        related_name='bid_user')
    amount = models.PositiveIntegerField()

    objects = BidQuerySet.as_manager()

    def get_absolute_url(self):
        return reverse('detail', args=[self.pk])
        
    def __str__(self):
        return f"{self.amount} in Listing No: {self.auction.id}"

    class Meta:
        ordering = ['amount']

    @staticmethod
    def high_bid(auction, bidder, bid_amount):
        """util method to ascertain highest bid in auction then update in related auction obj
        **auction---listing being bid on, bid__auction
        **bidder---user bidding
        **amount--- current highest bid
        """
        ###error checks, is current bid less than start bid? etc
        if bid_amount < auction.start_bid:
            return
        if (auction.highest_offer and bid_amount < auction.highest_offer.amount):
            return
        if bidder.id is auction.user.id:
            raise PermissionDenied
        
##after checks create highest bid object in listing model
        new_high_bid = Bid.objects.create(
            auction= auction,
            bidder = bidder,
            amount = bid_amount
        )
        auction.highest_offer = new_high_bid
        auction.save()

形式

class BidForm(forms.ModelForm):
    class Meta:
        model = Bid
        fields = [
            'amount',
        ]

        widgets = {
            'amount' : forms.NumberInput(attrs={'class' : 'form-control'}),
        }

        def __init__(self, *args, **kwargs):
        """override __init__ pop related auction from kwargs"""   
            auction = kwargs.pop('auction')
            self.auction = auction
            ##call super with related obj 
            super().__init__(*args, **kwargs)
            

        ##clean data/validate, ensuring bid is larger than highest bid and starting bid
        def clean_amount(self):
            amount = self.cleaned_data["amount"]
            ##check if less than starting bid
            if self.auction.start_bid > amount:
                raise ValidationError(_('Bid is less than starting bid'))
            if (self.auction.highest_offer__amount >= amount):
                raise ValidationError(_('Bid is less than current highest bid'))
            return amount

看法

class BidCreateView(LoginRequiredMixin, CreateView):
    
    model = Bid
    form_class = BidForm
    template_name = "auction/auction_detail.html"

    def get_context_data(self, **kwargs):
        bidder = self.request.user
        c = super().get_context_data(**kwargs)
        c["auction"] = self.auction
        if bidder.id is self.auction.user.id:
            c["form"] = None
        return c

    ###get_form_kwargs() method to supply user and listing during form creation
    def get_form_kwargs(self):

        kwargs = super().get_form_kwargs()
        pk_ = self.kwargs.get('pk')
        auction = Listing.objects.get(pk = pk_)
        kwargs = {
            'auction' : auction
        }

        return kwargs

    def form_invalid(self, form):
        return super().form_invalid(form)

    def form_valid(self, form):
        bid_amount = form.cleaned_data["amount"]

        try:
            with transaction.atomic():
                Bid.high_bid(
                    self.auction,
                    self.request.user,
                    bid_amount
                )
        except IntegrityError:
            messages.error(self.request, "An unexpected error has occured")

        messages.success(self.request, "Bid submitted successfully!")

        return super().form_valid(form)

模板

{% extends "auctions/layout.html" %}

{% load custom_tags %}}

{% block body %}

    <div class="row">
        <div class="col">
            <div class="card" style="width: 40rem;">
                <img src="{{ object.product.img_url }}" class="card-img-top" alt="item">
                <div class="card-body">
                  <h5 class="card-title">{{ object.product.title }}</h5>
                  <p class="card-text">{{ object.product.desc }}</p>
                </div>
                <div>
                    <ul class="list-group list-group-flush">
                    {% for offer in object.offer.all %}
                        <li class="list-group-item">Highest Bid: {{ offer.amount|usd }}</li>
                    {% endfor %}
                        <li class="list-group-item">Listed By: {{ object.user }}</li>
                        <li class="list-group-item">Category: {{ object.product.category }}</li>
                        <li class="list-group-item">Auction ends: {{ object.date_end }}</li>
                    </ul>
                </div>
                {% if user.is_authenticated %}    
                <div class="card-body">
                    <div class="row">
                        <div class="form-group col-3">
                            <form action="{% url 'AuctionBid' pk=object.pk %}" method="post">
                                {% csrf_token %}
                                {{ bidform.as_p }}
                                <button type="submit" class="btn btn-primary">Place Bid</button>
                            </form> 
                        </div>
                        <div class="form-group col-3">
                            #PASS
                        </div>
                    </div>
                </div>  
                {% else %}
                    
                {% endif %}
                  
            </div>
        </div>
    </div>



{% endblock %}

追溯

Internal Server Error: /bid/2
Traceback (most recent call last):
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/contrib/auth/mixins.py", line 52, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/views/generic/edit.py", line 172, in post
    return super().post(request, *args, **kwargs)
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/views/generic/edit.py", line 140, in post
    form = self.get_form()
  File "/Users//.pyenv/versions/3.8.3/lib/python3.8/site-packages/django/views/generic/edit.py", line 33, in get_form
    return form_class(**self.get_form_kwargs())
TypeError: __init__() got an unexpected keyword argument 'auction'

为什么要覆盖Meta类中的__init__ 您的BidForm定义不应该更像

class BidForm(Form):
    def __init__(auction, *args, **kwargs):
        self.auction = auction
        super().__init__(*args, **kwargs)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM