问题描述
我在表单小部件中显示多对多字段时遇到问题。 类别未显示在模板中。 标题可以(显示),但类别不正确-类别为空。 如何在带有多选复选框的模板表单中显示多对多字段? 为什么我不能以小部件形式显示文章类别?
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_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ł',)
class Meta:
model = Article
widgets = {
'category': forms.CheckboxSelectMultiple
}
labels = {
'category': 'label of category'
}