【问题标题】:Django CreateUpdateView implementation in the django templateDjango 模板中的 Django CreateUpdateView 实现
【发布时间】:2020-12-14 20:31:36
【问题描述】:

我对 django Class based views 非常陌生,正在尝试将其与我现有的项目集成。 我的目标是使用相同的Class based viewCreateUpdate 学生申请表。 我正在尝试从@scubabuddha 的solution 的回答中整合CreateUpdateView

views.py

from createupdateview import CreateUpdateView

class StudentView(CreateUpdateView):
   template_name="admission.html"
   Model = Student
   form_class = StudentForm
  
  def get(self, request, *args, **kwargs):
    return self.post(request, *args, **kwargs)

  def post(self, request, *args, **kwargs):
    forms = {"userform": UserForm(request.POST or None), guardian..., contact..., # other 5-6 forms}
    
    if request.POST:
      invalid_forms = [form.is_valid() for form in self.forms.values()]
      if not all(invalid_forms):
        messages.error(request,'You must fill up all the valid mandatory form fields!')
        return render(request, 'admission.html', forms)
      #-- Logic to validate and save each form
      ...
      return render(request, 'admission.html', forms)  
    return render(request, 'admission.html', forms)

这对CreateView 非常有效,但无法理解如何将其用于UpdateVieweditview。如果用户点击editview{{form|crispy}} 也应该显示详细信息以允许用户编辑表单。

urls.py(我也想把下面2个url合并成1个,可以这样吗?)

from django.urls import path
from students import views 
from students.views import StudentList, StudentView

urlpatterns = [
    
    path('', StudentList.as_view(), name='students'), 
    path('add/', StudentView.as_view(), name='addview'), 
    path('<int:pk>/edit/', StudentView.as_view(), name='editview'), 
...
]

我想在UpdateView 表格中显示所有学生详细信息 -

admission.html

<form class="form" name="admissionForm" id="admissionForm" method="post" 
            enctype="multipart/form-data" action="{% url 'addview' %}"> 
 {% csrf_token %}
  <div class="pages">
     <h4 class="mt-2 mb-3">Personal Information</h4>
      {% include "student_errors.html" %}                
      {{userform|crispy}}      #-- It should display student details 
      {{guardian_form|crispy}}    
      {{contact_form|crispy}}    
      ....
      <div class="btn_container">
          <button type="submit" class="btn btn-info float-right btn-next">Submit</button>  
      </div>
 </div>

P.S.我在这里保留了最少的代码,在实际生产中它的代码很大。 (将 Django 应用程序 1.9 迁移到 3.0)

【问题讨论】:

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


    【解决方案1】:

    您从this solution 使用的CreateUpdateView 继承自ModelFormMixin,并且只希望处理一种表单(初始化、form_class、保存...)。在您的代码中,您正在重写 get()post() 方法,因此从 CreateUpdateView 继承是没有意义的。

    您可以使用简单的View(未经测试)来做到这一点:

    from django.http import Http404
    from django.views.generic import View
    from django.shortcuts import render
    
    class StudentView(View):
        template_name = "admission.html"
    
        def get_object(self):
            if self.kwargs.get('pk'):
                try:
                    obj = Student.objects.get(pk=pk)
                except Student.DoesNotExist:
                    raise Http404("No student found matching the query")
                else:
                    return obj
            return None # create view
    
        def get_view(self, request, *args, **kwargs):
            forms = {"userform": UserForm(request.POST or None, instance=self.object), guardian..., contact...} # other 5-6 forms}
            if request.POST:
                invalid_forms = [form.is_valid() for form in self.forms.values()]
                if not all(invalid_forms):
                    messages.error(request,'You must fill up all the valid mandatory form fields!')
                else:
                    #-- Logic to validate and save each form
            return render(request, self.template_name, forms)  
    
        def get(self, request, *args, **kwargs):
            self.object = self.get_object()
            return self.get_view(request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            self.object = self.get_object()
            return self.get_view(request, *args, **kwargs)
    
    
    
    

    【讨论】:

    • 完美,我只是在寻找这种方法。非常感谢。我也错过了instance=self.object
    • 另一个快速的问题,我需要定义单独的 2 个网址吗?无论如何我可以将它们合并为相同的View
    • 也许可以,但为了代码的可读性,我会保留两者。
    • 好的,谢谢,但现在有了这个视图。在网址中我收到错误 - AttributeError: type object 'StudentView' has no attribute 'as_view'
    • 你继承自 View : class StudentView(View): 吗?
    猜你喜欢
    • 2011-07-29
    • 2022-11-18
    • 2019-09-11
    • 2017-08-13
    • 2018-03-01
    • 2018-10-08
    • 2012-11-29
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多