【发布时间】: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