Формы Django: Список флажков, заполненных из модели

#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 %} в вашем шаблоне.

Однако в этом коде есть и некоторые другие ошибки.

  1. Похоже, вы смешиваете product_category_level1 и product_category_level1_form в своем коде представления. Все они должны быть одной и той же переменной. Вам нужно использовать ту же переменную, чтобы при привязке данных POST и вызове is_valid() форма, которую вы показываете пользователю, содержала какие-либо ошибки проверки. В том виде, в каком вы имеете его в настоящее время, вы всегда предоставляете пользователю новый экземпляр формы — если какие-либо проверки данных завершатся неудачей, форма будет представлена снова со всеми пустыми полями и без сообщений об ошибках.
  2. Вам нужно указать 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’) и это сработало. Спасибо за вашу помощь!