django 模板中的 Django CreateUpdateView 实现
Django CreateUpdateView implementation in the django template
我是 django 的新手 Class based views,正在尝试将它与我现有的项目集成。
我的目标是使用相同的 Class based view
到 Create
和 Update
学生申请表。
我正在尝试从 solution.
的@scubabuddha 的回答中整合 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
非常有效,但无法理解如何将其用于 UpdateView
或 editview
。如果用户点击 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)
您正在使用的 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)
我是 django 的新手 Class based views,正在尝试将它与我现有的项目集成。
我的目标是使用相同的 Class based view
到 Create
和 Update
学生申请表。
我正在尝试从 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
非常有效,但无法理解如何将其用于 UpdateView
或 editview
。如果用户点击 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)
您正在使用的 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)