【问题标题】:Django- TypeError... post() missing 1 required positional argument: 'listing_id'Django- TypeError ... post() 缺少 1 个必需的位置参数:'listing_id'
【发布时间】:2020-12-24 19:01:51
【问题描述】:

我对 Python 还是很陌生,而 Django stackoverflow 确实是我在这段旅程中的强项。我正在开发一个 Django 应用程序,车主将列出他们的车队,并且有兴趣为出租车或优步租用这些车辆的司机将提出租用汽车的请求…… 我现在基本上有三个模型,用户(车主和司机)车主列出的车(models.Listing)和model.Rent(司机提出租车请求),我有一个listView来列出所有可用的汽车和用于显示每辆车详细信息的详细视图,我在详细视图上有一个按钮,当驾驶员单击时,我希望它获取已登录的驾驶员 request.user 实例和汽车列表模型中的主键详细视图并将其保存在租用模型中……但我收到“TypeError at /listing/1/ (post() missing 1 required positional argument: 'listing_id')” 下面是我的 view.py、models.py 和错误消息:我在这里阅读了各种类似的问题,有些建议使用 Listing.id 而不是 Listing.pk……这导致了 ValueError。关于stackoverflow的规则,我花了大约一周的时间尝试来自类似问题的建议并在其他地方进行研究,但他们似乎都没有分享我正在尝试做的事情的详细细节,从这里和那里阅读我发现考虑到我正在尝试使用的视图,我必须使用get_object_or_404,但也许我没有正确使用它。作为最后的手段,我不得不在这里寻求帮助。如果有人可以帮助我,我真的很感激。提前谢谢你。

view.py

class ListingDetailView(DetailView):
    model = Listing

    def post(self, request, pk, listing_id,  *args, **kwargs):
        car = Listing.objects.get(pk=listing_id)
        listing = get_object_or_404(Listing.pk, pk=pk)
        rent, created = Rent.objects.get_or_create(
            car_id=car,
            driver=request.user,
            )

        rent.save(request.POST, listing, rent)
        messages.info(request, "Rent request has been made succesfully.")
        return redirect('/')

url.py

urlpatterns = [

path('listing/<int:pk>/', ListingDetailView.as_view(), name='listing-detail'),

]

models.py

class Listing(models.Model):

    car_owner = models.ForeignKey(User, on_delete=models.CASCADE)
    car_model = models.CharField(max_length=50)

    def __str__(self):
        return f'{self.car_year}  {self.car_make}  {self.car_model}'

    def get_absolute_url(self):
        return reverse('listing-detail', kwargs={'pk': self.pk})


class Rent(models.Model):
    car_id = models.ForeignKey(Listing, on_delete=models.SET_NULL, null=True, blank=True)
    driver = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    approved = models.BooleanField(default=False)

listing_detail.html

<form method="POST">
<button type="submit" name="hire-car" class="btn btn-primary">Rent Car</button>
    </form>

错误

TypeError at /listing/1/

post() missing 1 required positional argument: 'listing_id'

Request Method: POST

Request URL:    http://127.0.0.1:8000/listing/1/

Django Version: 3.1

Exception Type: TypeError

Exception Value:    post() missing 1 required positional argument: 'listing_id'

Exception Location: /Users/ChuzzyOfficial/PycharmProjects/djangoProject/instarydes/.venv/lib/python3.8/site-packages/django/views/generic/base.py, line 101, in dispatch
Python Executable:  /Users/ChuzzyOfficial/PycharmProjects/djangoProject/instarydes/.venv/bin/python3
Python Version: 3.8.5

更多错误

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/listing/1/

Django Version: 3.1
Python Version: 3.8.5
Installed Applications:
['accounts.apps.AccountsConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'app.apps.AppConfig',
 'crispy_forms']
Installed 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']



Traceback (most recent call last):
  File "/Users/ChuzzyOfficial/PycharmProjects/djangoProject/instarydes/.venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/ChuzzyOfficial/PycharmProjects/djangoProject/instarydes/.venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/ChuzzyOfficial/PycharmProjects/djangoProject/instarydes/.venv/lib/python3.8/site-packages/django/views/generic/base.py", line 73, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/ChuzzyOfficial/PycharmProjects/djangoProject/instarydes/.venv/lib/python3.8/site-packages/django/views/generic/base.py", line 101, in dispatch
    return handler(request, *args, **kwargs)

Exception Type: TypeError at /listing/1/
Exception Value: post() missing 1 required positional argument: 'listing_id'

【问题讨论】:

  • 尝试将方法更改为def post(self, request, *args, **kwargs):,然后检查*args 以查看您收到的参数。
  • 这个问题有很多很长的代码供潜在的回答者阅读...尝试使用minimal, reproducible example 将其缩小一点。这将使您的问题更具可读性,并帮助其他人在没有太多代码的情况下测试您的问题的解决方案。
  • @Mike67 args 是空的并且没有传递任何东西,但是 kwargs 只包含 pk
  • 我已按照@monsieuralfonse64 的建议将我的代码减少到必要的位
  • HTML页面好像没有发送listing_id。在页面中,添加一个listing_id表单元素并检查值是否传递给方法。

标签: python django django-models


【解决方案1】:

我还没有机会测试任何东西,但仅从阅读错误来看,这是我的最佳猜测。

错误:post() missing 1 required positional argument: 'listing_id'

我会将此解释为您的发帖请求实际上没有直接收到listing_id。这使我想知道您的 URL 路径是如何设置的。如果您只是使用return reverse('listing-detail', kwargs={'pk': self.pk}),那么我假设'pk' 将是通过的位置参数,而不是'listing_id'

因此,我的攻击计划是了解通过发布请求实际发送的内容。正如@Mike67 建议的那样,我会检查您的 *args 和 **kwargs 发生了什么。或者,您可以为参数设置默认值:listing_id=None,然后检查:

if listing_id: #you know listing_id was passed through

但是,我会保留更多用于调试。

我建议您查看这篇文章: https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views

编辑

看到url参数,有点意思。您只收到 pk 值。

但是!为什么不用 pk 值代替 id?

object = ObjectClass.objects.get(pk=pk)

您可以在此处了解不同之处:(在大多数情况下,它们是相同的) Django queries - id vs pk

或者,我不知道这是否可行,但我很想知道如果你尝试会发生什么:self.get_object()?

【讨论】:

  • 感谢您的回复,我在帖子中包含了我的 URL 模式,PK 肯定会通过,但我在这里读到 [链接] (thebuild.com/blog/2010/12/22/…) id 始终可用使用过,这就是为什么我选择使用它。
猜你喜欢
  • 2019-05-27
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2019-06-25
  • 2013-10-02
  • 1970-01-01
相关资源
最近更新 更多