Привет, мне удалось создать inlineformset_factory, но мой виджет в родительской модели не работает, хотя я указал их в ModelForm.

Мои формы.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 не работает ....

Мой views.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 ...

0
seba6m6 1 Ноя 2018 в 06:01

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})})`
1
Uroš Trstenjak 1 Ноя 2018 в 05:24