【问题标题】:Widgets in inlineformset_factoryinlineformset_factory 中的小部件
【发布时间】:2018-11-01 03:01:43
【问题描述】:

嘿,我设法制作了一个 inlineformset_factory,但我在父模型中的小部件无法正常工作,尽管我已在 ModelForm 中指定它们。

我的 forms.py :

class PostForm(forms.ModelForm):

    post = forms.CharField(widget=CKEditorWidget())

    class Meta:
        model  = Post
        fields = ['title', 'author','picture','post','draft','publish']

class PostVocabForm(forms.ModelForm):

    class Meta:
        model  = PostVocab
        exclude = ()    

PostVocabInlineFormSet = inlineformset_factory(
    Post,
    PostVocab,
    extra=1,
    exclude=(),
)

我的 CKEditorWidget 不工作....

我的意见.py:

class PostPostVocabCreate(CreateView):
    model = Post
    form_class = PostForm
    # fields = ['title', 'author', 'picture', 'post', 'draft', 'publish']


    def get_redirect_url(self, pk):
        return reverse_lazy('blog:post_detail',
                            kwargs={'slug': pk},
                            )

    def get_context_data(self, **kwargs):
        data = super(PostPostVocabCreate, self).get_context_data(**kwargs)
        if self.request.POST:
            data['postvocabs'] = PostVocabInlineFormSet(self.request.POST)
        else:
            data['postvocabs'] = PostVocabInlineFormSet()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        postvocabs = context['postvocabs']
        with transaction.atomic():
            self.object = form.save()

            if postvocabs.is_valid():
                postvocabs.instance = self.object
                postvocabs.save()
        return super(PostPostVocabCreate, self).form_valid(form)

我猜我的父模型 (Post) 中的小部件在使用 inlineformset_factory 时被覆盖...

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以在 inlineformset_factory 中设置小部件。

    PostVocabInlineFormSet = inlineformset_factory(
        Post,
        PostVocab,
        extra=1,
        exclude=(),
        widgets={'post': CKEditorWidget()
    )
    

    来自 Django 文档...inlineformset_factory 使用 modelformset_factory 并将其大部分参数传递给 modelformset_factory。这意味着您可以像将 widgets 参数传递给 modelformset_factory 一样使用它。

    AuthorFormSet = modelformset_factory(
    ...     Author, fields=('name', 'title'),
    ...     widgets={'name': Textarea(attrs={'cols': 80, 'rows': 20})})`
    

    【讨论】:

    • class Meta: model = Post fields = ['title', 'author','picture','post','draft','publish'] 小部件 = { 'post': forms. CharField(widget=CKEditorWidget()), } 这成功了,我也忘了在我的模板中添加 {{form.media}} ...
    猜你喜欢
    • 2011-04-17
    • 2018-10-12
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-08-22
    • 2010-11-04
    相关资源
    最近更新 更多