Django模板中的Django CreateUpdateView实现

2024-09-28 18:56:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我对djangoClass 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}}还应显示详细信息,以允许用户编辑表单

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)


Tags: namefromimportselfformviewreturnrequest
1条回答
网友
1楼 · 发布于 2024-09-28 18:56:55

this solution使用的CreateUpdateView继承自ModelFormMixin,并期望只处理一个表单(初始化、表单\类、保存等)。在您的代码中,您正在重写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)



相关问题 更多 >