目的是在创建讨论时显示标题下拉列表。
模型.py
class Discussion(models.Model):
creator = models.ForeignKey(User,
on_delete=models.DO_NOTHING,
related_name="is_creator")
communaute = models.ForeignKey(Communaute,
on_delete=models.CASCADE,
related_name="belongs_to")
title = models.CharField(max_length=100, blank=False, null=False, unique=True)
a_propos = models.CharField(max_length=500, blank=False, null=False)
slug = models.SlugField(null=False, unique=True)
rubrique = models.ForeignKey(Rubrique, models.SET_NULL, blank=True, null=True)
created_at = models.DateTimeField(default=datetime.now, blank=True)
class Rubrique(models.Model):
title = models.CharField(max_length=20, blank=False, null=False)
explication = models.CharField(max_length=80, blank=True, null=True)
communaute = models.ForeignKey(Communaute,
related_name="has_rubrique",
on_delete=models.CASCADE)
slug = models.SlugField(null=False, unique=False)
created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
html
<form method="post" action="{% url 'discussion_create' communaute.slug %}" enctype="multipart/form-data">
{% csrf_token %}
<!-- Modal feed header START -->
...
<!-- Modal feed header END -->
<!-- Modal feed body START -->
<div class="modal-body">
<!-- Add Feed -->
<div class="mb-3">
<!-- Feed box -->
<div class="w-100">
{{ form_discussion.title.label }}
{{ form_discussion.title }}
</div>
</div>
<div class="mb-3">
<div class="w-100">
{{ form_discussion.a_propos.label }}
{{ form_discussion.a_propos }}
</div>
</div>
<div class="col-lg-3 mb-3">
{{ form_discussion.rubrique.label }}
{{ form_discussion.rubrique }}
</div>
<!-- Dropzone image START -->
<div class="mb-3">
{{ form_discussion.bg_image.label }}
{{ form_discussion.bg_image }}
</div>
<!-- Dropzone image END -->
</div>
<!-- Modal feed body END -->
<!-- Modal feed footer -->
...
<!-- Modal feed footer -->
</form>
为此,我使用了
forms.Select
,因为我需要定义属性以保留 Bootstrap 标签
class DiscussionForm(forms.ModelForm):
class Meta:
model = Discussion
fields = ('title', 'a_propos', 'rubrique', 'bg_image')
# https://stackoverflow.com/questions/5329586/django-modelchoicefield-filtering-query-set-and-setting-default-value-as-an-obj
widgets = {
'title': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Création de discussion'}
),
'a_propos': forms.Textarea(attrs={
'class': 'form-control',
'placeholder': 'En quelques mots ... 500 max',
'rows': 3}
),
'rubrique': forms.Select(attrs={
'class': 'form-control',
}),
'bg_image': forms.FileInput(attrs={
'class': 'form-control',
}
),
}
labels = {
'title': 'Titre :',
'a_propos': 'Description :',
'rubrique': 'Rubrique :',
'bg_image': 'Image de fond :',
}
我尝试使用
modelchoicefield
但我发现无法定义 attrs
,因此引导程序丢失了。
所以,我希望只列出与公社相对应的 rubriques,事实上,我获得了表 Rubrique 中的所有记录。
看来我应该覆盖 form.Select 但我不知道如何执行该操作。
对于社区:
第一点是选择Rubrique项目:
def __init__(self, *args, **kwargs):
communaute_id = kwargs.pop('communaute_id', None)
super(DiscussionForm, self).__init__(*args, **kwargs)
if communaute_id:
self.fields['rubrique'].queryset = Rubrique.objects.filter(communaute=communaute_id)
这完成了工作!
您可以参考以下帖子 Django ModelChoiceField:过滤查询集并将默认值设置为对象
因此,需要渲染模板如下
return render(request, 'communaute/discussions/list_discussions.html', {
...
'form_discussion': DiscussionForm(communaute_id=communaute.id),
...
})
第二点是使用列表中的一项进行初始化: 不幸的是,我无法在
initial
定义中成功使用 widget
关键字。
所以我说'required': True
widgets = {
'rubrique': forms.Select(attrs={
'class': 'form-control',
'required': True,
}),
}
提供了预期的应用结果😁