Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何筛选当前登录用户的Django表单下拉列表(基于类的视图)_Python_Django_Django Forms_Django Views_Django Class Based Views - Fatal编程技术网

Python 如何筛选当前登录用户的Django表单下拉列表(基于类的视图)

Python 如何筛选当前登录用户的Django表单下拉列表(基于类的视图),python,django,django-forms,django-views,django-class-based-views,Python,Django,Django Forms,Django Views,Django Class Based Views,我有两个模型,Fillup和Car,Fillup模型有一个外键(例如,用于记录汽车加油的时间),在创建新的Fillup的表单中,我想将Car字段的下拉列表限制为仅与当前用户关联的汽车,但现在它显示的是所有用户的汽车。我已经看到了一些解决方案,涉及将请求从视图传递到表单中,但我不知道如何使用我当前设置的基于类的视图来完成。这是我的密码: 型号.py class Fillup(models.Model): username = models.ForeignKey(User,on_delete

我有两个模型,Fillup和Car,Fillup模型有一个外键(例如,用于记录汽车加油的时间),在创建新的Fillup的表单中,我想将Car字段的下拉列表限制为仅与当前用户关联的汽车,但现在它显示的是所有用户的汽车。我已经看到了一些解决方案,涉及将请求从视图传递到表单中,但我不知道如何使用我当前设置的基于类的视图来完成。这是我的密码:

型号.py

class Fillup(models.Model):
    username = models.ForeignKey(User,on_delete=models.CASCADE)
    date = models.DateField(default=date.today)
    price_per_gallon = models.FloatField()
    trip_distance = models.FloatField()
    gallons = models.FloatField()
    car = models.ForeignKey('Car',on_delete=models.CASCADE)

    @property
    def total_sale(self):
        return round(self.price_per_gallon*self.gallons, 2)

    @property
    def mpg(self):
        return round(self.trip_distance/self.gallons, 4)


class Car(models.Model):
    username = models.ForeignKey(User,on_delete=models.CASCADE)
    name = models.CharField(max_length=25)
    make = models.CharField(max_length=25)
    model = models.CharField(max_length=25)
    model_year = models.IntegerField(choices=MODEL_YEARS)
    status = models.BooleanField(choices=STATUS)

    def __str__(self):
        return self.name
class FillupListView(ListView):
    model = Fillup
    context_object_name = 'fillup_list'
    ordering = ['-date']

    # NOT USING THIS YET
    # def get_queryset(self):
    #     return Fillup.objects.filter(user=self.request.user)

class CarListView(ListView):
    model = Car
    ordering = ['name']

class NewFillup(LoginRequiredMixin,CreateView):
    model = Fillup
    fields = ('date', 'price_per_gallon', 'trip_distance', 'gallons', 'car')
    redirect_field_name = 'fillup_list'

    def form_valid(self, form):
        form.instance.username = self.request.user
        return super().form_valid(form)

class NewCar(LoginRequiredMixin,CreateView):
    model = Car
    fields = ('name', 'make', 'model', 'model_year', 'status')
    redirect_field_name = 'car_list'

    def form_valid(self, form):
        form.instance.username = self.request.user
        return super().form_valid(form)
class FillupForm(forms.ModelForm):

    def __init__(self, user, *args, **kwargs):
        super(FillupForm,self).__init__(*args, **kwargs)
        self.fields['car'].queryset = Car.objects.filter(username=user)

    class Meta():
        model = Fillup
        fields = ('date', 'price_per_gallon', 'trip_distance', 'gallons', 'car')


class CarForm(forms.ModelForm):

    class Meta():
        model = Car
        fields = ('name', 'make', 'model', 'model_year', 'status')
视图.py

class Fillup(models.Model):
    username = models.ForeignKey(User,on_delete=models.CASCADE)
    date = models.DateField(default=date.today)
    price_per_gallon = models.FloatField()
    trip_distance = models.FloatField()
    gallons = models.FloatField()
    car = models.ForeignKey('Car',on_delete=models.CASCADE)

    @property
    def total_sale(self):
        return round(self.price_per_gallon*self.gallons, 2)

    @property
    def mpg(self):
        return round(self.trip_distance/self.gallons, 4)


class Car(models.Model):
    username = models.ForeignKey(User,on_delete=models.CASCADE)
    name = models.CharField(max_length=25)
    make = models.CharField(max_length=25)
    model = models.CharField(max_length=25)
    model_year = models.IntegerField(choices=MODEL_YEARS)
    status = models.BooleanField(choices=STATUS)

    def __str__(self):
        return self.name
class FillupListView(ListView):
    model = Fillup
    context_object_name = 'fillup_list'
    ordering = ['-date']

    # NOT USING THIS YET
    # def get_queryset(self):
    #     return Fillup.objects.filter(user=self.request.user)

class CarListView(ListView):
    model = Car
    ordering = ['name']

class NewFillup(LoginRequiredMixin,CreateView):
    model = Fillup
    fields = ('date', 'price_per_gallon', 'trip_distance', 'gallons', 'car')
    redirect_field_name = 'fillup_list'

    def form_valid(self, form):
        form.instance.username = self.request.user
        return super().form_valid(form)

class NewCar(LoginRequiredMixin,CreateView):
    model = Car
    fields = ('name', 'make', 'model', 'model_year', 'status')
    redirect_field_name = 'car_list'

    def form_valid(self, form):
        form.instance.username = self.request.user
        return super().form_valid(form)
class FillupForm(forms.ModelForm):

    def __init__(self, user, *args, **kwargs):
        super(FillupForm,self).__init__(*args, **kwargs)
        self.fields['car'].queryset = Car.objects.filter(username=user)

    class Meta():
        model = Fillup
        fields = ('date', 'price_per_gallon', 'trip_distance', 'gallons', 'car')


class CarForm(forms.ModelForm):

    class Meta():
        model = Car
        fields = ('name', 'make', 'model', 'model_year', 'status')
forms.py

class Fillup(models.Model):
    username = models.ForeignKey(User,on_delete=models.CASCADE)
    date = models.DateField(default=date.today)
    price_per_gallon = models.FloatField()
    trip_distance = models.FloatField()
    gallons = models.FloatField()
    car = models.ForeignKey('Car',on_delete=models.CASCADE)

    @property
    def total_sale(self):
        return round(self.price_per_gallon*self.gallons, 2)

    @property
    def mpg(self):
        return round(self.trip_distance/self.gallons, 4)


class Car(models.Model):
    username = models.ForeignKey(User,on_delete=models.CASCADE)
    name = models.CharField(max_length=25)
    make = models.CharField(max_length=25)
    model = models.CharField(max_length=25)
    model_year = models.IntegerField(choices=MODEL_YEARS)
    status = models.BooleanField(choices=STATUS)

    def __str__(self):
        return self.name
class FillupListView(ListView):
    model = Fillup
    context_object_name = 'fillup_list'
    ordering = ['-date']

    # NOT USING THIS YET
    # def get_queryset(self):
    #     return Fillup.objects.filter(user=self.request.user)

class CarListView(ListView):
    model = Car
    ordering = ['name']

class NewFillup(LoginRequiredMixin,CreateView):
    model = Fillup
    fields = ('date', 'price_per_gallon', 'trip_distance', 'gallons', 'car')
    redirect_field_name = 'fillup_list'

    def form_valid(self, form):
        form.instance.username = self.request.user
        return super().form_valid(form)

class NewCar(LoginRequiredMixin,CreateView):
    model = Car
    fields = ('name', 'make', 'model', 'model_year', 'status')
    redirect_field_name = 'car_list'

    def form_valid(self, form):
        form.instance.username = self.request.user
        return super().form_valid(form)
class FillupForm(forms.ModelForm):

    def __init__(self, user, *args, **kwargs):
        super(FillupForm,self).__init__(*args, **kwargs)
        self.fields['car'].queryset = Car.objects.filter(username=user)

    class Meta():
        model = Fillup
        fields = ('date', 'price_per_gallon', 'trip_distance', 'gallons', 'car')


class CarForm(forms.ModelForm):

    class Meta():
        model = Car
        fields = ('name', 'make', 'model', 'model_year', 'status')

在FillupForm中重写init方法只是我试图让它工作的事情之一,这是根据另一个Stackoverflow答案改编的,但它似乎没有任何效果。如有任何建议/示例可使此工作正常进行,我们将不胜感激!如果我需要提供更多的代码,请告诉我。您可以在init方法中执行类似操作

        cars = Car.objects.filter(username=user)
        self.fields['car'].autocomplete = False
        self.fields['car'].queryset = users

希望这能有所帮助。

我最终从r/Django在Reddit上的学习中得到了答案

我需要将以下内容添加到我的两个CreateView中:

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs['user'] = self.request.user
    return kwargs
他们还指出,我需要用form_class=forms.Fillup/Car替换两个createview上的字段=('blah blah blah')


我希望这能帮助和我有同样问题的人

谢谢你的回复!我最终从reddit上的一个用户那里得到了我需要的答案。我把他们给我的答案留在这里作为答案,这样可以帮助其他人在他们的代码中解决同样的问题