【问题标题】:Django CreateView without template rendering没有模板渲染的 Django CreateView
【发布时间】:2021-02-24 08:03:04
【问题描述】:

我在 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 中处理我的 post 请求,在单独的 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']})

【问题讨论】:

    标签: django django-views django-class-based-views


    【解决方案1】:

    template_name 是必填项Django Docs

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

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

    因此您会收到错误TemplateDoesNotExist

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

    您可以简单地创建 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")})
    

    或使用A simple view:

    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)
    

    【讨论】:

    • 感谢您的回复。我已经尝试过完全相同的代码行,但它仍然显示错误 TemplateDoesNotExist,似乎模板是在 form_valid 和 get_success_url 方法之前呈现的。
    • 或者您也可以创建一个空白模板:blank.html。并在任何其他视图中使用它。或者创建一个简单的视图。我更新了我的答案。
    • 天啊,成功了! blank.html 帮助我调试它。我意识到我的问题在于表单验证。谢谢!
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 2022-07-22
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2018-05-20
    • 2018-11-05
    相关资源
    最近更新 更多