如何在 Django ModelForm 中的外键字段上使用 Select?

问题描述 投票:0回答:1

目的是在创建讨论时显示标题下拉列表。

模型.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 但我不知道如何执行该操作。

django-forms foreign-keys modelchoicefield
1个回答
0
投票

对于社区:

第一点是选择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,
        }),
    }

提供了预期的应用结果😁

© www.soinside.com 2019 - 2024. All rights reserved.