【问题标题】:How to render the Form (in a template tag) automatically created by CreateView如何呈现由 CreateView 自动创建的表单(在模板标签中)
【发布时间】: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


【解决方案1】:

journal_tags.py

register = template.Library()

@register.inclusion_tag('template_tags/journal_list.html', takes_context=True)
def get_journals(context, self):
    journals = to_journal.objects.filter(journal_user=context['request'].user)
    return {
        'journals': journals,
        'form': JournalForm
        }

JournalForm 是在 models.py

中创建的 ModelForm
class JournalForm(ModelForm):
    class Meta:
        model = to_journal
        fields = ['journal_name']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2020-07-13
    • 2019-11-17
    • 1970-01-01
    • 2021-02-19
    • 2010-09-20
    相关资源
    最近更新 更多