没有模板渲染的Django CreateView

Serikbol Oralbek

我在CreateView中保存表单时遇到问题,我找到了此解决方案,它对我有用:

class ScheduleDocumentView(CreateView):

    def post(self, request, pk, *args, **kwargs):
        form = ScheduleDocumentForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.relates_to = Schedule.objects.get(pk=pk)
            form.save()
        return redirect('planning:schedule-detail', pk=pk)

但是,我的目标是使用form_valid()和get_success_url()保存表单,而在CreateView中不使用模板。我尝试过这样的事情(不起作用):

class ScheduleDocumentView(CreateView):
    model = ScheduleDocument
    form_class = ScheduleDocumentForm

    def form_valid(self, form):
        form.instance.relates_to = Schedule.objects.get(pk=pk)
        form.save()
        return redirect('planning:schedule-detail', pk=pk)

    def get_success_url(self):
        return reverse('planning:schedule-detail', kwargs={'pk': pk})

它需要一个模板,还有其他方法可以在DetailView中处理我的发布请求,在单独的CreateView中处理它并将其重定向到我的DetailView页面吗?

这是我的DetailView模板:

<form enctype="multipart/form-data" action="{% url 'planning:upload-document' schedule.pk %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="button button--secondary">Attach</button>

网址:

path('schedules/<int:pk>/', ScheduleDetailView.as_view(), name='schedule-detail'),
path('schedules/<int:pk>/upload-document/', ScheduleDocumentView.as_view(), name='upload-document'),

我遇到了这个解决方案:

class ScheduleDocumentView(CreateView):
    model = ScheduleDocument
    form_class = ScheduleDocumentForm

    def form_valid(self, form):
        form.instance.schedule = Schedule.objects.get(pk=self.kwargs['pk'])
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('planning:schedule-detail', kwargs={'pk': self.kwargs['pk']})
NKSM

template_name是必需的Django Docs

字符串定义要使用的模板的全名。不定义template_name将引发django.core.exceptions.ImproperlyConfigured异常。

或者,在您的情况下,Django将导致默认的template_name'yourapp/scheduledocument_create_form.html'

因此,您会收到错误消息TemplateDoesNotExist

您可以pk(Django Docs)获取self.kwargs

您可以简单地创建blank.html模板。

class ScheduleDocumentView(CreateView):
    http_method_names = ['post']
    template_name = 'blank.html' # or use this 'schedule_detail.html'
    model = ScheduleDocument
    form_class = ScheduleDocumentForm

    def form_valid(self, form):
        form.instance.relates_to = Schedule.objects.get(pk=self.kwargs.get("pk"))
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('planning:schedule-detail', kwargs={'pk': self.kwargs.get("pk")})

或使用一个简单的视图

def create_schedule_document(request, pk):
    if request.method == 'POST':
        form = ScheduleDocumentForm(request.POST, request.FILES)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.relates_to = Schedule.objects.get(pk=pk)
            obj.save()
    else:
        form = ApplyAnonymousForm()
    return redirect('planning:schedule-detail', pk=pk)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章