django - 覆盖 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
我在这里做错了什么?
解决方案
您不应传递构造的表单,而应仅传递对表单类的引用:
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
form_class = PostCreateForm # no parenthesis
# ...
因此,Django 每次都会构造一个新表单(取决于使用 等的情况request.POST
)。
如果需要向表单传递额外的参数,可以在get_form_kwargs
[Django-doc]中指定字典。
推荐阅读
- php - 在 rest API (php) 中调用 LINK
- vue.js - 如何在 VueJS 中使用 v-for ++ 单选按钮
- ruby - 我需要从另一个具有依赖关系的类中调用一个方法
- android - 检测到具有空属性的信标
- python - 如何提取具有相应时间步长的音素数据?
- scala - 如何实现从类型类到接口语法的自动转换(Cats 示例)
- database - 在 Navision 2018 CU2 数据库中检测已安装的语言
- dialogflow-es - 设置 webhook 以实现对话流的最佳方法?
- r - 使用键重新映射数据库
- sql-server - Azure 拉伸数据库突然失败