Change_form.html не может отобразить выпадающие поля выбора для ModelForm

Я работаю над реализацией выпадающего меню для страницы "добавить" функции Product_to_Stock_Proxy_Admin в интерфейсе администратора Django. Опции для выпадающего меню берутся из модели Distributor, которая является внешним ключом для модели Product.

На выходе отображается только само выпадающее меню, и в нем нет никаких значений из модели Distributor, даже значения по умолчанию "---------". Я не понимаю, почему это происходит.

Причина, по которой я использую change_form, заключается в том, что я использую Ajax для отображения других столбцов сразу после того, как пользователь заполнит barcode_number. Поэтому мне нужно реализовать выпадающее меню самостоятельно.

models.py

class Product(models.Model):
    name = models.CharField(max_length=20, blank=True, null=True)
    distributor = models.ForeignKey('Distributor', on_delete=models.CASCADE)
    barcode_number = models.CharField(max_length=20, blank=True, null=True)
    total_amount = models.IntegerField(blank=True, null=True)

class Distributor(models.Model):
    name = models.CharField(max_length=10)

admin.py

class Product_to_Stock_Proxy_Admin(admin.ModelAdmin):
    form = Product_to_Stock_Proxy_Form
    change_form_template = 'admin/change_form.html'

    fields = ["distributor", "name", "total_amount"]

admin/change_form.html

Этот код отображает только сам выпадающий элемент без каких-либо опций, даже без значения по умолчанию "-------":

{% block content %}
<form method="post">
    {% csrf_token %}
    {{ form.non_field_errors }}

    <div class="form-row field-barcode_number">
        <div>
            <div class="flex-container">
                <label for="id_barcode_number">條碼號碼:</label>
                <input type="text" id="id_barcode_number" name="barcode_number" value="{{ form.barcode_number.value }}" />
            </div>
        </div>
    </div>

    <div class="form-row field-distributor">
        <div>
            <div class="flex-container">
                <label for="id_distributor">經銷商名稱:</label>
                <select name="distributor" id="id_distributor">
                    {% for distributor in form.field.queryset %}
                        <option value="{{ distributor.id }}">{{ distributor }}</option>
                    {% endfor %}
                </select>
            </div>
        </div>
    </div>

    <div class="form-row field-total_amount">
        <div>
            <div class="flex-container">
                <label for="id_total_amount">總金額:</label>
                <input type="text" id="id_total_amount" name="total_amount" value="{{ form.total_amount.value }}" readonly />
            </div>
        </div>
    </div>

    <button type="submit">submit</button>
</form>
{% endblock %}

forms.py

Вся информация выводится в приглашении Anaconda следующим образом:

Initializing form
Queryset set: <QuerySet [<Distributor: David>, <Distributor: John>]>
Form fields: {'barcode_number': <django.forms.fields.CharField object at 0x0000022094F8FD50>, 'distributor': <django.forms.models.ModelChoiceField object at 0x0000022094F8D690>}
class Product_to_Stock_Proxy_Form(forms.ModelForm):
    distributor = forms.ModelChoiceField(queryset=Distributor.objects.all())
    
    class Meta:
        model = Product
        fields = ["distributor", "name", "total_amount"]
       
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("Initializing form")
        print("Queryset set:", self.fields['distributor'].queryset)
        self.fields['distributor'].widget.attrs.update({'id': 'id_distributor'})
        print("Form fields:", self.fields)

Тестирование оболочки Django

Сценарии, которые я запускаю в оболочке Python, работают очень хорошо. Я пробую следующее:

print(form.fields)
{'distributor': <django.forms.models.ModelChoiceField object at 0x0000020FE7C66450>}
form = Product_to_Stock_Proxy_Form(data={'distributor': 1})
print(form.is_valid())
True
print(form.as_p())
<p>
<label for="id_distributor">Distributor:</label>
<select name="distributor" id="id_distributor" required>
<option value="" selected>---------</option>
<option value="1">David</option>
<option value="2">John</option>
</select>
</p>
print(Distributor.objects.all())
<QuerySet [<Distributor: David>, <Distributor: John>]>

Подводя итог, я думаю, что проблема, скорее всего, в коде шаблона, так как вывод из forms.py нормальный. Информация из модели Distributor передается в шаблон неправильно.

Поскольку я обнаружил, что выпадающее меню хорошо работает в Django Shell, я изменил свою admin/change_form.html следующим образом. Однако все, что я вижу, - это ничего; нет никакого выпадающего меню.

{% block content %}
<form method="post">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <div class="form-row field-distributor">
        <div>
            <div class="flex-container">
               {{form.as_p}}
            </div>
        </div>
    </div>
    <button type="submit">submit</button>
</form>
{% endblock %}
{% block content %}
<form method="post">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <div class="form-row field-distributor">
        <div>
            <div class="flex-container">
               {{form.distributor}}
            </div>
        </div>
    </div>
    <button type="submit">submit</button>
</form>
{% endblock %}

На выходе я хочу получить выпадающее меню с информацией из Distributor модели.

Вернуться на верх