首页 > 解决方案 > 覆盖 django CreateView 的表单

问题描述

也许只是另一个愚蠢的初学者问题:我无法覆盖当前在views.py中使用以下代码的django模型表单。

下面的代码运行良好!

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content']

    ### want this instead of line 1 and 2 above --> form_class = PostCreateForm()

    view_args = collections.namedtuple('view_args', ['page_title'])
    view_args = view_args(page_title="Create Post")

    def get_context_data(self, *args, **kwargs):
        self.tgt_url_args = MyHelper.parse_tgt_url(self)
        context = super(PostCreateView, self).get_context_data(*args, **kwargs)
        context.update(MyHelper.get_context_metadata(self, self.tgt_url_args, PostCreateView.view_args))
        return context

    def form_valid(self, form):
        form.instance.author = self.request.user
        tgt_url_args = MyHelper.parse_tgt_url(self)
        blog_article = Article.objects.get(pk=tgt_url_args.get('Article', '0'))
        form.instance.article_field = blog_article
        return super().form_valid(form)

但是,我想覆盖表单以便将占位符添加到字段中。所以我将第 1 行和第 2 行替换为:

form_class = PostCreateForm()

我还在 forms.py 中添加了以下内容:

from django import forms
from . models import Post


class PostCreateForm(forms.ModelForm):


    class Meta:
        model = Post
        fields = ['title', 'content']

print('imported PostCreateForm')

但是,当我导入并运行它时,我收到以下错误:

'PostCreateForm' object is not callable

我在这里做错了什么?

标签: djangoforms

解决方案


您不应传递构造的表单,而应仅传递对表单的引用:

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    form_class = PostCreateForm  # no parenthesis

    # ...

因此,Django 每次都会构造一个新表单(取决于使用 等的情况request.POST)。

如果需要向表单传递额外的参数,可以在get_form_kwargs[Django-doc]中指定字典。


推荐阅读