首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django ModelChoice字段条件ForeignKey

Django ModelChoice字段条件ForeignKey
EN

Stack Overflow用户
提问于 2018-08-21 05:16:49
回答 1查看 856关注 0票数 0

我下午大部分时间都在冲浪,在这个特殊的困境中已经有一段时间了。

我正在试图弄清楚,如果用户驾驶过这种类型的汽车,如何将外键作为下拉选择显示出来。例如,为了尽可能简单地保持这一点...

假设我有一个CarsManufacturers和一个UserProfile模型。

我有一个Cars的模型,所以...

代码语言:javascript
复制
class Cars(models.Model):

    car_name = models.CharField(max_length=80)    
    class = models.ForeignKey(Manufacturer,null=True,on_delete=models.DO_NOTHING,related_name='car_manufacturer')

我有一个Manufacturers的模型,所以...

代码语言:javascript
复制
class Manufacturers(models.Model):

        manu_name = models.CharField(max_length=80)  

然后我有一个UserProfile模型..。

代码语言:javascript
复制
class Userprofile(models.Model):

   user = models.OneToOneField(User,on_delete=models.CASCADE)
   user_name = models.CharField(max_length=80)    
   car_owned = models.ForeignKey(Car,null=True,on_delete=models.DO_NOTHING,related_name='car_owned')

到目前为止一切都很好。

我有一个视图,其中我列出了所有的Manufacturers,这也很好用。它在下面的表单视图中显示了我所期望的所有制造商。

代码语言:javascript
复制
class ManufacturerForm(forms.Form):

    dropdown = forms.ModelChoiceField(queryset=Manufacturer.objects.all())

    def __init__(self, *args, **kwargs):
        super(ManufacturerForm, self).__init__(*args, **kwargs)
        self.fields['dropdown'].widget.attrs['class'] = 'choices1'
        self.fields['dropdown'].empty_label = ''

我正在使用下面的FORMVIEW来显示表单...

代码语言:javascript
复制
class ManufacturerView(LoginRequiredMixin,FormView):
    form_class = ManufacturerForm
    template_name = 'Directory/HTMLNAME.html'

    def get_form_kwargs(self):
        kwargs = super(ManufacturerView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def form_valid(self, form):
        manufacturer = form.cleaned_data['dropdown']
        return HttpResponseRedirect(reverse("NAME:manufacturer",kwargs={'pk':manufacturer.pk}))

这一切都运行得很好。但是,我不知道如何将制造商下拉列表限制为仅限于用户驾驶过的汽车。我试图根据用户的个人资料,从本质上限制下拉菜单的显示,只显示与用户拥有的汽车相关的制造商。我已经研究了反向查找,也尝试了类似下面列出的方法来解决我的问题……

代码语言:javascript
复制
class ManufacturerForm(forms.Form):

    dropdown = forms.ModelChoiceField(queryset=Manufacturer.objects.filter(car_manufacturer=1)

    def __init__(self, *args, **kwargs):
        super(ManufacturerForm, self).__init__(*args, **kwargs)
        self.fields['dropdown'].widget.attrs['class'] = 'choices1'
        self.fields['dropdown'].empty_label = ''

但这显然只给了我Manufacturer模型的记录1。我正在尝试弄清楚如何根据用户的car_owned数据仅显示与个人用户相关的记录。我可以列出所有制造商,然后只显示ListView中相关的记录,但我试图将下拉列表限制在ListView中有相关记录的位置。提前感谢您的任何想法。

EN

回答 1

Stack Overflow用户

发布于 2018-08-21 05:35:54

我认为这一切都取决于你的订单和车型之间的关系,也许可以尝试在ManufacturerCar之间添加一个ManyToMany关系,这样一家制造商就可以生产很多辆汽车:

类别制造商(models.Model):

代码语言:javascript
复制
name = models.CharField(max_length=80)
car = models.ManyToManyField(Car)

那么它可能是这样做的情况:

代码语言:javascript
复制
qs = Manufacturer.objects.all(car=user.car_owned)

dropdown = forms.ModelChoiceField(qs)

在您的views.py文件中:

代码语言:javascript
复制
form = ManufacturerForm(request.POST, user=request.user)

(您可能需要查看上面的内容是否有效,因为我不确定表单是否可以传入请求对象)。

免责声明:我看到你使用的是基于class的view...so,我可能需要调整上面的设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51938596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档