gpt4 book ai didi

python - 初次提交模型表单时 Django 内联表单集是否可行?

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:10 25 4
gpt4 key购买 nike

我看过很多类似的帖子,但没有足够的信息来帮助我。

免责声明:我对 Django 非常很陌生。

我正在尝试为我的公司创建一个就业申请,该申请将托管在子域(例如 jobs.mycompany.com)上 - 这是我的第一个真正的 Django 项目。我希望为最终用户完成的任务已经在管理部分完成。

基本上,我将工作申请分为几个部分:

  • 申请人(只能是其中之一)
  • 教育(教育记录[即学校] - 可以是多个)
  • Job_Experience(申请人工作过的组织 - 可以是多个)
  • 可用性(与 Highlander 一样,只能有一个)

问题是 - 我认为我没有正确地将其放入一种形式,而且我也不知道如何一次保存所有这些。我尝试EducationJob_Experience制作表单集,但我认为我也没有正确应用这些表单。

本质上,我希望所有这些都出现,当用户单击“提交”时,它会创建所有必要的记录 - 申请人和可用性是实际需要的唯一部分。

编辑

重申一下:管理面板正在做我想要在前端实现的目标。,但是(在前端)我无法:

  • 使申请人选择器输入消失
  • 申请人实例分配给非申请人模型
  • 我可能是错的,但我认为可能有一种方法可以将这些表单统一到一个实例中,而不是像我现在所做的那样将多个实例传递给 View 。

代码如下:

models.py

from django.db import models
from django import forms
from django.forms import ModelForm
from datetime import datetime

class Applicant(models.Model):
name = models.CharField(max_length=200)
city = models.CharField(max_length=200)
state = models.CharField(max_length=200)
zip = models.CharField(max_length=200)
social_security_number = models.CharField(max_length=200)
phone = models.CharField(max_length=200)
alt_phone = models.CharField(max_length=200, blank=True)
us_citizen = models.BooleanField()
committed_felony = models.BooleanField()
is_16 = models.BooleanField()
has_drivers_license = models.BooleanField()
is_disabled = models.BooleanField()
prev_employed = models.BooleanField()
felony_explanation = models.TextField(blank=True)
disabled_explanation = models.TextField(blank=True)
prev_employment_manager = models.CharField(max_length=200, blank=True)
prev_employment_year = models.CharField(max_length=4, blank=True)
skills = models.TextField()

def __unicode__(self):
return self.name

class Education(models.Model):
GED = 'GED'
HIGH_SCHOOL = 'HIG'
JUNIOR_COLLEGE = 'JUN'
UNIVERSITY = 'UNI'
TYPE_OF_SCHOOL_CHOICES = (
(GED, 'GED'),
(HIGH_SCHOOL, 'High School'),
(JUNIOR_COLLEGE, 'Junior College'),
(UNIVERSITY, 'University'),
)

type = models.CharField(
max_length=3,
choices=TYPE_OF_SCHOOL_CHOICES,
default=HIGH_SCHOOL
)
school_name = models.CharField(max_length=200)
school_city = models.CharField(max_length=200)
school_state = models.CharField(max_length=200)
graduated = models.BooleanField()
graduation_year = models.CharField(max_length=4)
applicant = models.ForeignKey(Applicant)

class Job_Experience(models.Model):
FULL_TIME = 'F'
PART_TIME = 'P'
FTPT_CHOICES = (
(FULL_TIME, 'Full Time'),
(PART_TIME, 'Part Time'),
)

organization_name = models.CharField(max_length=200)
organization_city = models.CharField(max_length=200)
organization_state = models.CharField(max_length=200)
supervisor_name = models.CharField(max_length=200)
supervisor_phone = models.CharField(max_length=200)
supervisor_contact_allowed = models.BooleanField()
currently_employed = models.BooleanField()
start_date = models.DateField()
end_date = models.DateField()
starting_title = models.CharField(max_length=200)
ending_title = models.CharField(max_length=200)
start_salary = models.CharField(max_length=20)
end_salary = models.CharField(max_length=20)
reason_for_leaving = models.TextField()
full_time_part_time = models.CharField(
max_length = 1,
choices = FTPT_CHOICES,
default = PART_TIME
)
applicant = models.ForeignKey(Applicant)

class Availability (models.Model):
NOT_AVAILABLE = 'XX'
OPEN_AVAILABILITY = 'OP'
AVAILABLE_BETWEEN = 'AB'
AVAILABILITY_CHOICES = (
(NOT_AVAILABLE, 'Not Available'),
(OPEN_AVAILABILITY, 'Available All Day'),
(AVAILABLE_BETWEEN, 'Available Between Certain Hours'),
)

mon_availability = models.CharField(
max_length = 2,
choices = AVAILABILITY_CHOICES,
default = NOT_AVAILABLE
)
mon_hours_start = models.CharField(max_length = 10)
mon_hours_end = models.CharField(max_length = 10)
tue_availability = models.CharField(
max_length = 2,
choices = AVAILABILITY_CHOICES,
default = NOT_AVAILABLE
)
tue_hours_start = models.CharField(max_length = 10)
tue_hours_end = models.CharField(max_length = 10)
wed_availability = models.CharField(
max_length = 2,
choices = AVAILABILITY_CHOICES,
default = NOT_AVAILABLE
)
wed_hours_start = models.CharField(max_length = 10)
wed_hours_end = models.CharField(max_length = 10)
thu_availability = models.CharField(
max_length = 2,
choices = AVAILABILITY_CHOICES,
default = NOT_AVAILABLE
)
thu_hours_start = models.CharField(max_length = 10)
thu_hours_end = models.CharField(max_length = 10)
fri_availability = models.CharField(
max_length = 2,
choices = AVAILABILITY_CHOICES,
default = NOT_AVAILABLE
)
fri_hours_start = models.CharField(max_length = 10)
fri_hours_end = models.CharField(max_length = 10)
fri_availability = models.CharField(
max_length = 2,
choices = AVAILABILITY_CHOICES,
default = NOT_AVAILABLE
)
sat_hours_start = models.CharField(max_length = 10)
sat_hours_end = models.CharField(max_length = 10)
sat_availability = models.CharField(
max_length = 2,
choices = AVAILABILITY_CHOICES,
default = NOT_AVAILABLE
)
sun_hours_start = models.CharField(max_length = 10)
sun_hours_end = models.CharField(max_length = 10)
applicant = models.OneToOneField(Applicant)

# Forms

class ApplicantForm(ModelForm):
class Meta:
model = Applicant

class EducationForm(ModelForm):
class Meta:
model = Education

class JobExperienceForm(ModelForm):
class Meta:
model = Job_Experience

class AvailabilityForm(ModelForm):
class Meta:
model = Availability

views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.template import Context, loader
from applications.models import Applicant, Education, Job_Experience, Availability, ApplicantForm, EducationForm, JobExperienceForm, AvailabilityForm
from django.forms.formsets import formset_factory


def index(request):
education_formset = formset_factory(EducationForm, extra=3)
message = 'Forms have not been submitted.'

if request.method == 'POST':
applicant_form = ApplicantForm(request.POST)
education_form = education_formset(request.POST)
if applicant_form.is_valid() and education_form.is_valid():
applicant_form.save()
education_form.applicant = applicant_form
message = 'Forms are valid.'
else:
message = 'Forms are not valid.'
else:
applicant_form = ApplicantForm()
education_form = education_formset()

return render(request,
'applications/index.html',
{
'applicant_form' : applicant_form,
'education_form' : education_form,
'message' : message
}
)

admin.py

from django.contrib import admin
from applications.models import Applicant, Education, Job_Experience, Availability

class EducationInline(admin.StackedInline):
model = Education
extra = 3

class JobExperienceInline(admin.StackedInline):
model = Job_Experience
extra = 3

class AvailabilityInline(admin.StackedInline):
model = Availability

class ApplicantAdmin(admin.ModelAdmin):
inlines = [EducationInline, JobExperienceInline, AvailabilityInline]

admin.site.register(Applicant, ApplicantAdmin)

index.html

<h1>Employment Application</h1>
<p>Please enter your information into the fields below.</p>
<hr />
<p>{{ message }}</p>
<hr />
<form action="{% url 'applications:index' %}" method="post">
{% csrf_token %}
{{ applicant_form.as_p }}
<hr />
{{ education_form.as_p }}
<input type="submit" />
</form>

最佳答案

我意识到这已经是几个月前的事了,也许你已经使用 Django 解决了这个问题,或者现在正在使用其他东西,但你已经非常接近了。您的用例的基本 View 模式是:

  1. 设置表单集
  2. 验证父表单
  3. 验证表单集

类似于以下内容:

def index(request):

EducationFormSet = formset_factory(
Application,
Education,
form=EducationForm,
extra=3,
)

if request.method == 'POST':
application_form = ApplicationForm(request.POST)

if application_form.is_valid():
application = application_form.save(commit=False)
education_formset = EducationFormSet(request.POST, instance=application)

if education_formset.is_valid():
application.save()
education_formset.save()

return HttpResponseRedirect(reverse('thanks_and_good_luck_view'))
else:
education_formset = EducationFormSet(request.POST)
else:
application_form = ApplicationForm()
education_formset = EducationFormSet()

return render_to_response(
'applications/index.html',
{
'application_form': application_form,
'education_formset': education_formset,
},
context_instance=RequestContext(request)
)

这里棘手的一点是保存父表单时的commit=False。这允许您获取父模型的未提交实例,以用于表单集中的子模型实例。

关于python - 初次提交模型表单时 Django 内联表单集是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16455168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com