Django CreateView - 仅为其中一个字段自定义 get_queryset

Django CreateView - custom get_queryset for only one of the fields

我有一个 Mission 模型,其中包含 Vessel 模型的外键,即

class Vessel(models.Model):
    name = models.CharField(max_length=256)

class Mission(models.Model):
    title = models.CharField(max_length=256, null=False, blank=False)
    vessel = models.ForeignKey(to=Vessel, related_name='vessels')
    status = models.IntegerField(choices=((1, 'In progress'),
                                          (2, 'Success'),
                                          (3, 'Partial success'),
                                          (4, 'Failure')))

我正在使用 CreateView 来轻松让用户创建船只和任务对象。在 Mission CreateView 页面上有一个下拉菜单 (<select>),允许用户 select 现有船只。

观看次数:

class VesselCreate(CreateView):
    model = Vessel
    fields = ['name']

class MissionCreate(CreateView):
    model = Mission
    fields = ['title', 'vessel', 'status']

问题是 Mission CreateView 页面上的容器是按创建时间排序的,我希望它们按名称排序。

我应该在哪里覆盖 get_queryset 方法(如果有的话)?我尝试了几个地方,但他们没有改变 <select>.

中船只的顺序

您不想在此处覆盖 get_queryset。相反,您需要创建一个表单,并在 Vessel 字段上定义一个自定义查询集:

class MissionForm(forms.ModelForm):
    vessel = forms.ModelChoiceField(queryset=Vessel.objects.all().order_by('name'))
    class Meta:
        model = Mission
        fields = ['title', 'vessel', 'status']

class MissionCreate(CreateView):
    form_class = MissionForm
    model = Mission