【问题标题】:How do i make many to many field as a chekbox items in template.?我如何将多对多字段作为模板中的复选框项目。?
【发布时间】:2019-09-20 07:00:32
【问题描述】:

我有 3 个模型,一个是 Category(Fields = category_name),另一个是 SubSategory(Fields = category(ForeignKey to Category),sub_category)。另一个模型是 DummyModel。

# Model
class DummyModel(models.Model):
    name = models.CharField(max_length=20)
    email = models.EmailField()
    category = models.ManyToManyField(Category)
    sub_category = models.ManyToManyField(SubCategory)

这是我的表格

class StartProjectForm(ModelForm):
    class Meta:
        model = StartProject
        fields = (
            'name',
            'email',
            'category',
            'sub_category',
        )

    def __init__(self, *args, **kwargs):
        super(StartProjectForm, self).__init__(*args, **kwargs)

        self.fields["category"].widget = CheckboxSelectMultiple()
        self.fields["category"].queryset = Category.objects.all()

        self.fields["sub_category"].widget = CheckboxSelectMultiple()
        self.fields["sub_category"].queryset = SubCategory.objects.all()

    def save(self, commit=True):
        clean = self.cleaned_data.get
        name = clean('name')
        email = clean('email')
        category = clean('category')
        sub_category = clean('sub_category')

        obj = StartProject()
        obj.name = name
        obj.email = email
        obj.category = category
        obj.sub_category = sub_category
        obj.save()

这是我的看法

#view

class StartProjectView(View):
    template_name = 'start-project.html'

    def get(self, request):
        form = StartProjectForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = StartProjectForm(request.POST)
        if form.is_valid():
            form.save()
            form = StartProjectForm()
            return render(request, self.template_name, {'form':form})

        return HttpResponse("<h2>Done</h2>")

这是我的模板

# Template

<form method="post">
        {% csrf_token %}
        <p>name: <input type="text" name="name"></p>
        <p>Email: <input type="text" name="email"></p>
        {% for form in form %}
            <input type="checkbox" name="category">{{ form.category }}
        {% endfor %}
        <br>
        {% for form in form %}
            <input type="checkbox" name="sub_category">{{ form.sub_category }}
        {% endfor %}
        <button type="submit">Start Now</button>
    </form>

我希望模板中的类别和子类别作为复选框项目。我该怎么做?

【问题讨论】:

  • 你也应该添加你的 StartProjectForm 代码,谢谢。
  • 我添加了表格
  • 您是否尝试显示使用 {{ form }} 完全呈现的表单?它显示了什么?您的 {% for form in form %} 语句不正确,也许您想使用 {% for field in form.visible_fields %}{{ field }}{% endfor %}
  • 是的,我尝试了表单方法 {{ form }} 它正在工作。但我想在模板中使用 HTML 制作自定义表单
  • 好的,使用 {{ form.FIELD_NAME }} 应该可以解决问题。看看文档 -> docs.djangoproject.com/en/2.2/topics/forms/… 或者考虑使用像 django-crispy-forms 这样的包,它允许您完全自定义表单。

标签: django django-templates


【解决方案1】:

在挖掘您的需求后,您正在寻找的是{{ form.FIELD_NAME }}

你的表单 {{ form.category }}{{ form.sub_category }} 应该可以工作。

考虑到这只会呈现输入本身,而不是标签或其他 DOM 元素。

查看有关“手动渲染字段”的文档以获取更多信息 -> https://docs.djangoproject.com/en/2.2/topics/forms/#rendering-fields-manually

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 2014-05-20
    • 1970-01-01
    • 2014-01-04
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多