Фильтр формы Django не выбирает вывод

Моя форма показывает все объекты ce_hostname в базе данных с помощью выпадающего списка. Я хочу отфильтровать ce_hostname до тех, которые имеют только общую ссылку на порядок. Я не могу заставить это работать. Мой выпадающий список в настоящее время пуст.

forms.py

class Cx_BaseForm(ModelForm):
        class Meta:
                model = Cx_Base
                fields = ['cx_hostname', 'new', 'ce_hostname', 'location', 'manged_module_model', 'slot']

        def __init__(self, *args, **kwargs):
            super(Cx_BaseForm, self).__init__(*args, **kwargs)
            self.fields['ce_hostname'].queryset = Ce_Base.objects.filter(order_reference=self.instance.order_reference)

models.py

class Ce_Base(models.Model):
    ce_hostname = models.CharField(max_length=15, validators=[CE_HOSTNAME_REGEX], verbose_name="CE Hostname", help_text="Hostname of router.")
    order_reference = models.ForeignKey(Order, null=True, on_delete=models.CASCADE)

class Cx_Base(models.Model):

    order_reference = models.ForeignKey(Order, null=True, on_delete=models.CASCADE)                                     
    cx_hostname = models.CharField(max_length=15, validators=[CX_HOSTNAME_REGEX], verbose_name="CX Hostname", help_text="Hostname of Switch.")                                  
    new = models.BooleanField(help_text="Select if installing new hardware. Leave blank if switch exists on DCN.")                                                                                              
    ce_hostname = models.ForeignKey(Ce_Base, null=True, on_delete=models.CASCADE, verbose_name="CE Hostname", help_text="Hostname of router in which the module will be inserted.")                                     
    location = models.TextField(null=True, blank=True, help_text="Address of site. Leave blank if not new.")
    manged_module_model = models.CharField(max_length=200, null=True, blank=True, choices=MANAGED_MODULES, help_text="Hardware model of switch. Leave blank if not new.")               
    slot = models.CharField(max_length=200, null=True, blank=True, choices=SLOT, help_text="Slot in which the module will be inserted. Leave blank if not new.")                                               

    l2_interfaces = JSONField(null=True)                                                                               

    def __str__(self):
        return self.cx_hostname

Когда форма создается с помощью Cx_BaseForm(), форма будет иметь экземпляр модели, который не имеет значений (связанный код here). Это означает, что self.instance.order_reference на методе __init__ будет None, вызывая проблему, которую вы наблюдали.

Если вы хотите передать order из представления в форму, один из подходов заключается в передаче order в форму следующим образом:

@login_required
def addCX_Base(request, pk_test):
    order = Order.objects.get(id=pk_test)
    cx_base_form = Cx_BaseForm(order_reference=order) # pass it to the form
    if request.method == 'POST':
    # ...

Не нужно делать cx_base_form.instance.order_reference = order. Затем добавьте обработку для order_reference на форму:

class Cx_BaseForm(ModelForm):
    # ...
    def __init__(self, *args, order_reference=None, **kwargs):
        super().__init__(*args, **kwargs)

        if order_reference:
            self.fields['ce_hostname'].queryset = Ce_Base.objects.filter(
                order_reference=order_reference,
            )
Вернуться на верх