#python #django #django-forms
#python #django #django-forms
Вопрос:
В Django
я пытаюсь отобразить список checkboxes
, в котором варианты выбора заполняются из значений в поле модели. Вот что у меня есть на данный момент:
Модели
#Model that feeds the list of checkboxes
class Category_Level1(models.Model):
category_level1_name = models.CharField(max_length = 50)
формы
class ProductCategoryLevel1Form(forms.Form):
product_category_level1 = forms.MultipleChoiceField(label = "Product Category", choices = Category_Level1.objects.all(), widget = forms.CheckboxSelectMultiple)
число просмотров
def select_product(request):
product_category_level1 = ProductCategoryLevel1Form()
if request.method == 'POST':
product_category_level1_form = ProductCategoryLevel1Form(request.POST)
if product_category_level1_form.is_valid():
product_category_level1_list = product_category_level1_form.cleaned_data.get('product_category_level1', 'Unk')
# Saving the selected categories to another table
product_cat_obj = Product_Category_Level1(category_level1_name = product_category_level1_list)
product_cat_obj.save()
context = {
'product_category_level1' : product_category_level1
}
return render(request, 'select_product/select.html', context)
шаблон
<div class="row">
<label for="id_prod_category"></label>
{% product_category_level1 %}
</div>
Я получаю следующую ошибку:
Недопустимый тег блока в строке 23: ‘product_category_level1’, ожидаемый ‘endblock’. Вы забыли зарегистрировать или загрузить этот тег?
Что я делаю не так?
Ценю любые предложения.
Ответ №1:
Django использует два типа разметки — {% ... %}
для тегов и {{ ... }}
для переменных.
В этом коде вы пытаетесь отобразить product_category_level1
переменную, поэтому вам следует использовать {{ product_category_level1 }}
вместо {% product_category_level1 %}
в вашем шаблоне.
Однако в этом коде есть и некоторые другие ошибки.
- Похоже, вы смешиваете
product_category_level1
иproduct_category_level1_form
в своем коде представления. Все они должны быть одной и той же переменной. Вам нужно использовать ту же переменную, чтобы при привязке данных POST и вызове is_valid() форма, которую вы показываете пользователю, содержала какие-либо ошибки проверки. В том виде, в каком вы имеете его в настоящее время, вы всегда предоставляете пользователю новый экземпляр формы — если какие-либо проверки данных завершатся неудачей, форма будет представлена снова со всеми пустыми полями и без сообщений об ошибках. - Вам нужно указать Django, как вы хотите, чтобы ваша форма отображалась — в виде
p
тегов, какli
метки и т.д. Таким образом, вам нужно будет добавить вызов методаas_p
следующим образом:{{ product_category_level1.as_p }}
. Дополнительные параметры рендеринга можно найти здесь: https://docs.djangoproject.com/en/1.10/topics/forms/#working-with-form-templates
Комментарии:
1. Большое спасибо за подробный ответ. Я исправил шаблон, чтобы в нем было {{ gift_category_level1.as_p }}. Я также исправил представления, установив ту же переменную. Теперь я получаю сообщение об ошибке, в котором говорится, что объект ‘Category_Level1’ не может быть повторен. Но запрос, заданный в forms -> choices, кажется, в порядке.
2. В формах я изменил выбор с Category_Level1.objects.all() на Category_Level1.objects.values_list(‘id’, ‘имя_категории_уровня1’) и это сработало. Спасибо за вашу помощь!