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
модели.