【发布时间】:2019-10-21 19:21:42
【问题描述】:
如何渲染由 CreateView CBV 自动创建的表单?
设置
views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView
from .models import Journal
from django.urls import reverse
class CreateJournal(LoginRequiredMixin, CreateView):
model = Journal
template_name = 'journals/journal_list.html'
fields = ('journal_name',)
def get_success_url(self):
return reverse('home')
def form_valid(self, form):
form.instance.journal_user = self.request.user
return super(CreateJournal, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(CreateJournal, self).get_context_data(**kwargs)
context['Journals'] = Journal.objects.filter(journal_user=self.request.user)
return context
urls.py
urlpatterns = [
path('', CreateJournal.as_view(), name='journals'),
path('<slug:slug>', JournalEntriesList.as_view(), name='to-journal-entries'),
]
如您所见,我没有在这里提到特定的表格,那是因为我没有。 CreateView 会自动创建一个。如您所见,此视图(现在执行两项工作,帮助用户创建对象并同时显示所有对象)现在正在呈现到“to-journals/journal_list.html”。
我想在“主页”页面或任何其他页面上显示相同的内容(视图和表单)。
当前模板标签只从数据库(上下文)中获取数据
我目前的尝试是这样的:
journal_tags.py
register = template.Library()
@register.inclusion_tag('template_tags/journal_list.html', takes_context=True)
def get_journals(context):
journals = Journal.objects.filter(journal_user=context['request'].user)
return {'journals': journals}
这成功地将所有现有期刊呈现到我想要的任何页面。现在,我该如何渲染 CreateView 为我创建的表单。
失败的方法
我尝试的一种方法是将 for 参数添加到函数中,如下所示:
journal_tags.py
@register.inclusion_tag('template_tags/journal_list.html', takes_context=True)
def get_journals(context):
journals = Journal.objects.filter(journal_user=context['request'].user)
return {
'journals': journals,
'form': CreateJournal,
}
这不起作用,因为 CreateJournal 是视图而不是表单。 我的问题是如何渲染class CreateJournal(LoginRequiredMixin, CreateView) 创建的表单?
感谢您抽出宝贵时间查看此内容。我非常感谢我们社区的帮助!祝你有美好的一天!
【问题讨论】:
-
CreateView动态创建的表单只是模型的默认模型表单Journal,使用modelform_factory。班级是form_class = django.forms.modelform_factory(Journal, fields=self.fields)。所以你可以用form_class()实例化你的空表单。或者你可以自己定义一个model form。
标签: django django-forms django-templates django-views