Как отобразить форму (в теге шаблона), автоматически созданную CreateView - PullRequest
0 голосов
/ 21 октября 2019

Как отобразить форму, автоматически созданную 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 голосов
/ 24 октября 2019

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 - это ModelForm, созданный в models.py

class JournalForm(ModelForm):
    class Meta:
        model = to_journal
        fields = ['journal_name']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...