如何呈现由CreateView自动创建的表单(在模板标签中)

时间:2019-10-21 19:21:42

标签: django django-forms django-templates django-views

如何呈现由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)创建的表单?

感谢您抽出宝贵的时间对此进行研究。我非常感谢社区的帮助!祝你有美好的一天!

1 个答案:

答案 0 :(得分:0)

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']