Python 我在/car/offer/4/无法分配处收到ValueError“;“4”字:&引用;CarRent.car”一词;必须是一个";汽车“;例如。尝试将汽车实例保存到表单时

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

我正在django为uber司机开发一个租车网站,从detailView我需要司机能够选择租车期限,其他信息将自动填入我的views.py表格中。我可以通过请求获得司机。用户,我还需要租车的PK。在这里搜索,我尝试了这里的人的各种建议,但我不断地得到一个又一个错误

使用
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调用也可以绕过信号。