我正在为客户开发一份请假申请表。由员工填写的表格允许员工选择他/她想要起飞的多天。当员工最初查看表单时,只显示一个日期条目。他们可以通过单击添加按钮动态添加更多日期(javascript)。
数据库设置:Form_Table,Date_Table,Form_Date_ManyToMany表(由Django生成)
我有两个与Django有关的问题。
1)如果员工输入3个日期,则每个日期字段将具有相同的名称。如何使用Django的Form或ModelForm验证每个字段?以下是日期字段的示例。
<input name="dates[]" />
<!-- or -->
<input name="dates" /> <!-- I have read this is the Django way -->
2)在我的数据库中,我与Form和Dates有一个ManyToMany关系。我确信我需要ManyToMany而不仅仅是一个ForeignKey来跟踪更改(这不是问题)。如何使用Django保存多个日期(在日期表中)并与表单(在表格表格中)具有ManyToMany关系。?
我对Python&amp; Django的。我从PHP切换,因为Django是我找到的最好的框架。
# Model
class Date(models.Model):
date = models.DateField()
emp_requested = models.ForeignKey(EmployeeRequested,null=True)
hr_approved = models.ForeignKey(HumanResourcesApproved,null=True)
class Form(models.Model):
pay_period = models.ForeignKey(PayPeriod)
employee = models.ForeignKey(Employee)
ack_ip = models.CharField(max_length=15, default='')
emp_signature = models.CharField(max_length=100)
date_of_hire = models.DateField()
state = models.ForeignKey(State)
scheduler = models.ForeignKey(Scheduler)
scheduler_form = models.ManyToManyField(SchedulerForm)
hr_status = models.CharField(max_length=100, default='')
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
enabled = models.BooleanField(default=True)
parent = models.ForeignKey('self',related_name='+')
root = models.ForeignKey('self',related_name='+')
dates = models.ManyToManyField(Date)
# View - this is an ajax call
def ajax_save_form(request):
form = EmployeeForm(request.POST or None)
return HttpResponse(form.is_valid())
# Form
class EmployeeForm(forms.ModelForm):
employee_name = forms.CharField(max_length=30)
employee_email = forms.EmailField()
county = forms.ModelChoiceField(queryset=County.objects.all())
job_type = forms.ModelChoiceField(queryset=JobType.objects.all())
pay_period = forms.CharField()
total_hours = forms.DecimalField()
class Meta:
model = Form
exclude = ( 'employee', 'ack_ip', 'state', 'scheduler', 'scheduler_form', 'hr_status', 'parent', 'root', 'dates',)
# HTML (template)
<!-- Stuff -->
<div id="date-group" class="control-group date-controls">
<label class="control-label" for="date">Date</label>
<div class="controls">
<div class="input-append">
<input type="text" placeholder="Click to see Calendar" name="dates[]" class="input-xlarge emp-dates" id="date">
<span class="add-on"><i class="icon-calendar"></i></span>
<a id="AddDateBtn" class="btn btn-primary"><i class="icon-plus icon-white"></i> Add additional day</a>
<br><br>
</div>
<div class="pull-left sub-controls">
<h4>Employee Section</h4>
<div class="well">
Reason for Absence:<br>
<select name="reasons[]" class="emp-reasons">
{% for reason in reasons %}
<option value="{{ reason.id }}">{{ reason.reason }}</option>
{% endfor %}
</select>
<span class="add-on emp-reason-help"><i class="icon-question-sign"></i></span>
<br><br>
Hours: <br>
<select name="hours[]">
{% for hour in hours %}
<option value="{{ hour }}">{{ hour }}</option>
{% endfor %}
</select>
<br><br>
Explanation Required:<br>
<textarea class="input-xlarge" name="explanations[]"></textarea>
</div>
</div>
</div>
</div>
<!-- Stuff -->
Employee可以拥有任意数量的HTML块。使用JavaScript我动态“复制”上面显示的html。这允许员工提交多个日期(日期[],小时[],原因[],解释[])。我需要在日期模型中保存每个日期组(日期[i],小时[i],原因[i],解释[i])。然后我需要与表单模型和提交的所有日期建立ManyToMany关系。我怎么能用ModelForm做到这一点。
我在网上看到一些代码表明可以这样做:
form = EmployeeForm()
if form.is_valid():
# do relationships here
我也不知道如何使用Django获取使用日期[],小时[],原因[]和解释[]的值。
答案 0 :(得分:2)
如果您确实需要将这些日期存储在具有ManyToMany关系的单独表中,那么您应该稍微扩展一下ModelForm。
首先,为 date 字段指定类,该字段应继承自django.forms.ModelMultipleChoiceField。在其中,覆盖 clean 函数,并在那里创建所有Date对象。该函数应该返回已创建对象的id列表(或者考虑返回parent的clean函数的结果,并将其传递给id列表)。然后在您的ModelForm中,您只需指定该字段属于您的新类,然后所有验证和保存都将起作用。
希望它会有所帮助;如果我不清楚,请多询问:)