Python 我在/car/offer/4/无法分配处收到ValueError“;“4”字:&引用;CarRent.car”一词;必须是一个";汽车“;例如。尝试将汽车实例保存到表单时
我正在django为uber司机开发一个租车网站,从detailView我需要司机能够选择租车期限,其他信息将自动填入我的views.py表格中。我可以通过请求获得司机。用户,我还需要租车的PK。在这里搜索,我尝试了这里的人的各种建议,但我不断地得到一个又一个错误 使用Python 我在/car/offer/4/无法分配处收到ValueError“;“4”字:&引用;CarRent.car”一词;必须是一个";汽车“;例如。尝试将汽车实例保存到表单时,python,django,Python,Django,我正在django为uber司机开发一个租车网站,从detailView我需要司机能够选择租车期限,其他信息将自动填入我的views.py表格中。我可以通过请求获得司机。用户,我还需要租车的PK。在这里搜索,我尝试了这里的人的各种建议,但我不断地得到一个又一个错误 使用 self.kwargs['pk']在/car/offer/4/处导致ValueError/无法分配“4”:“CarRent.car”必须是“car”实例。 然后我试着用 form.car=car.objects.get(pk=s
self.kwargs['pk']
在/car/offer/4/处导致ValueError/无法分配“4”:“CarRent.car”必须是“car”实例。
然后我试着用
form.car=car.objects.get(pk=self.kwargs.get('pk'))
导致/car/offer/4/'CarRent'对象的AttributeError没有属性“是有效的”
有人能告诉我如何将汽车实例保存在CarRent车型中吗?任何帮助都将不胜感激。谢谢
下面是我的代码(减少到相关位)
models.py
class Car(models.Model):
car_owner = models.ForeignKey(User, related_name='car_owner', on_delete=models.CASCADE)
class CarRent(models.Model):
car = models.ForeignKey(Car, related_name='rented_car', on_delete=models.CASCADE)
driver = models.ForeignKey(User, related_name='driver_renting', on_delete=models.CASCADE)
rented_weeks = models.BigIntegerField(default=1, choices=WEEK_CHOICES)
forms.py
class RentForm(forms.ModelForm):
class Meta:
model = CarRent
fields = ['rented_weeks']
我只显示租用的周数,因为这是我从用户那里需要的唯一信息
views.py
class CarView(FormMixin, DetailView):
model = Car
form_class = RentForm
def get_success_url(self):
return reverse('car-details', kwargs={'pk': self.object.pk})
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden()
self.object = self.get_object()
form = self.get_form()
form = form.save(commit=False)
form.car = self.kwargs['pk']
form.driver = request.user
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.save()
return super().form_valid(form)
form.car
需要一个car
对象,而不是带有主键的字符串,但您可以简单地使用:
from django.contrib.auth.mixins import LoginRequiredMixin
class CarView(LoginRequiredMixin, FormMixin, DetailView):
# …
def post(self, request, *args, **kwargs):
form = self.get_form()
self.object = self.get_object()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.instance.car_id = self.kwargs['pk']
form.instance.driver = self.request.user
form.save()
return super().form_valid(form)
来自django.contrib.auth.mixins导入登录所需的mixin
类别CarView(LoginRequiredMixin、FormMixin、DetailView):
# …
def post(自我、请求、*args、**kwargs):
form=self.get\u form()
self.object=self.get_object()
如果form.is_有效():
返回self.form\u有效(form)
其他:
返回自我。表单_无效(表单)
def表单_有效(自身、表单):
form.instance.car_id=self.kwargs['pk']
form.instance.driver=self.request.user
form.save()
return super().form\u有效(form)
注意:您可以将基于类的视图限制为具有
注意:通常最好使用来引用用户模型,而不是直接使用。有关更多信息,请参见
form.car
需要一个car
对象,而不是带有主键的字符串,但您可以简单地使用:
from django.contrib.auth.mixins import LoginRequiredMixin
class CarView(LoginRequiredMixin, FormMixin, DetailView):
# …
def post(self, request, *args, **kwargs):
form = self.get_form()
self.object = self.get_object()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.instance.car_id = self.kwargs['pk']
form.instance.driver = self.request.user
form.save()
return super().form_valid(form)
来自django.contrib.auth.mixins导入登录所需的mixin
类别CarView(LoginRequiredMixin、FormMixin、DetailView):
# …
def post(自我、请求、*args、**kwargs):
form=self.get\u form()
self.object=self.get_object()
如果form.is_有效():
返回self.form\u有效(form)
其他:
返回自我。表单_无效(表单)
def表单_有效(自身、表单):
form.instance.car_id=self.kwargs['pk']
form.instance.driver=self.request.user
form.save()
return super().form\u有效(form)
注意:您可以将基于类的视图限制为具有
注意:通常最好使用来引用用户模型,而不是直接使用。有关更多信息,请参见
@Williem感谢您提供的解决方案,但是使用您上面提供的方法会产生一个“名称错误,名称”请求未定义“知道我为什么会得到它吗?”@AbdulGiwa:这是
self.request.user
,而不是request.user
。非常有效,谢谢。按照建议使用settings.AUTH_USER_MODEL时,如果我不将其添加到post_save信号中,会不会有副作用?@AbdulGiwa:不会,通常不会。但是信号本身通常是一种反模式:很多ORM调用也可以绕过信号。@Williem感谢您的解决方案,但是使用上面提供的方法会产生一个“NameError,name”请求“没有定义”`知道我为什么会得到它吗?@AbdulGiwa:它是self.request.user
,不是请求。用户
。非常有效,谢谢。按照建议使用settings.AUTH_USER_MODEL时,如果我不将其添加到post_save信号中,会不会有副作用?@AbdulGiwa:不会,通常不会。但信号本身通常是一种反模式:许多ORM调用也可以绕过信号。