Django表单:从模型填充的复选框列表

时间:2016-10-24 04:38:53

标签: 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行的无效广告代码:&quot; product_category_level1&#39;,预计   &#39;端嵌段&#39 ;.您是否忘记注册或加载此标记?

我做错了什么?

感谢任何建议。

1 个答案:

答案 0 :(得分:0)

Django使用两种类型的标记 - tags {% ... %}variables {{ ... }}

在此代码中,您尝试呈现product_category_level1 变量,因此您应该在模板中使用{{ product_category_level1 }}而不是{% product_category_level1 %}

但是,此代码中还存在其他一些错误。

  1. 您似乎在视图代码中混合了product_category_level1product_category_level1_form。这些都应该是相同的变量。您需要使用相同的变量,因此在绑定POST数据并调用is_valid()时,您向用户显示的表单包含任何验证错误。正如您目前拥有它一样,您总是向用户提供表单的新实例 - 如果任何数据验证失败,表单将再次显示,所有字段都为空,没有错误消息。
  2. 您需要告诉Django您希望如何呈现表单 - p标记,li标记等。因此,您需要添加方法调用{{1}像这样:as_p。可以在此处找到更多渲染选项:https://docs.djangoproject.com/en/1.10/topics/forms/#working-with-form-templates