小部件形式的多对多字段

问题描述

我在表单小部件中显示多对多字段时遇到问题。 类别未显示在模板中。 标题可以(显示),但类别不正确-类别为空。 如何在带有多选复选框的模板表单中显示多对多字段? 为什么我不能以小部件形式显示文章类别?

MODELS.py

文章模型:

class Article(Created,HitCountMixin):
    title = models.CharField(max_length=120)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    category = models.ManyToManyField(ArticleCategory,related_name='articles')

类别模型:

class ArticleCategory(Created):
    category_name = models.CharField(max_length=128)
    slug = models.SlugField(null=False,unique=False)

观看次数

class UpdateArticleView(LoginrequiredMixin,UpdateView):
    template_name = 'news/update_article.html'
    form_class = EditArticleForm
    model = Article

    def get_success_url(self):
        pk = self.kwargs["pk"]
        slug = self.kwargs['slug']
        return reverse_lazy("news:article_detail",kwargs={'pk': pk,'slug': slug})

FORMS.py

class AddArticleForm(forms.ModelForm):

title = forms.CharField(
    label="Tytuł",max_length=120,help_text="Tytuł newsa",widget=forms.TextInput(attrs={"class": "form-control form-control-lg pr-5 shadow p-1 mb-1 bg-white rounded"}),required=True,)


category = forms.MultipleChoiceField(
    widget=forms.CheckBoxSelectMultiple,)

在我的 HTML模板中:

    <form method="post" enctype='multipart/form-data'>
        {% csrf_token %}
        {{ form.media }}
        {#        {%  crispy form %}#}
        {{ form|crispy }}
        <button type="submit" class="btn btn-outline-primary">EDYTUJ NEWS</button>
    </form>

解决方法

您认为form_classEditArticleForm,因此您应谨慎使用正确的表格。

ManyToManyField的表单字段通常为ModelMultipleChoiceField [Django-doc],但是无论如何都不必指定表单字段。您可以使用widgets选项:

class EditArticleForm(forms.ModelForm):
    title = forms.CharField(
        label='Tytuł',max_length=120,help_text='Tytuł newsa',widget=forms.TextInput(
            attrs={'class': 'form-control form-control-lg pr-5 shadow p-1 mb-1 bg-white rounded'}
        ),required=True,)


    class Meta:
        model = Article
        widgets = {
            'category': forms.CheckboxSelectMultiple
        }

您可以使用以下方法自定义标签:

class EditArticleForm(forms.ModelForm):
    title = forms.CharField(
        label='Tytuł',)


    class Meta:
        model = Article
        widgets = {
            'category': forms.CheckboxSelectMultiple
        }
        labels = {
            'category': 'label of category'
        }