Многие ко многим полям в форме виджета

У меня проблема с отображением поля «многие ко многим» в виджете формы. Категория не отображается в шаблоне. Заголовок в порядке (отображается), но категория нет - категория пуста. Что я могу сделать, чтобы отобразить многие поля в моей форме шаблона с флажками с множественным выбором? Почему я не могу отображать категории статей в форме виджета?

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>

person AM0k    schedule 19.10.2020    source источник
comment
Поле ModelMultipleChoiceField: docs.djangoproject.com/en/3.0/ ссылка/формы/поля/   -  person Willem Van Onsem    schedule 19.10.2020
comment
Кроме того, ваш form_class является EditArticleForm.   -  person Willem Van Onsem    schedule 19.10.2020


Ответы (1)


Ваш form_class в вашем представлении - это EditArticleForm, поэтому вы должны быть осторожны, используя правильную форму.

Поле формы для 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ł',
        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
        }
        labels = {
            'category': 'label of category'
        }
person Willem Van Onsem    schedule 19.10.2020
comment
Благодарю вас. Это нормально, но это не лучший способ, потому что я не могу сейчас установить эти флажки. Есть ли возможность сделать подобный заголовок в EditArticleForm? - person AM0k; 19.10.2020
comment
@AM0k: почему бы и нет? Вы по-прежнему можете добавлять классы в CheckboxSelectMultiple, например 'category': forms.CheckBoxSelectMultiple(attrs={'class': 'myclass'}). - person Willem Van Onsem; 19.10.2020
comment
Ооо... Конечно..! - person AM0k; 19.10.2020
comment
Могу ли я сделать этикетку для этого сейчас? Я не уверен, что я могу сделать этот checkboxex встроенным... Извините за так много вопросов... - person AM0k; 19.10.2020
comment
@AM0k: да, с опцией labels. - person Willem Van Onsem; 19.10.2020
comment
ДА! Ты самый лучший! - person AM0k; 19.10.2020