Фильтр формы 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,
)