请用Django实现:一个类叫StaffInfo,每个StaffInfo对应至少一条Emergency信息,Emergency分别包含有res_id(StaffInfo的外键), name,relation, address,tel等信息,如何在一个页面为同一个StaffInfo动态添加多条Emergency信息?比如说某个StaffInfo有一段Emergency,那么只填写一条,而另一个StaffInfo有两条Emergency,那么可以通过点击加号来动态增加一条Emergency并填写。请用具体代码实现并在代码中加上详细注释。
时间: 2024-03-15 15:47:30 浏览: 57
首先,需要在models.py文件中定义StaffInfo和Emergency两个模型类,代码如下:
```python
from django.db import models
class StaffInfo(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField()
...
class Emergency(models.Model):
res_id = models.ForeignKey(StaffInfo, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
relation = models.CharField(max_length=50)
address = models.CharField(max_length=100)
tel = models.CharField(max_length=20)
...
```
在上面的代码中,我们使用ForeignKey来建立StaffInfo和Emergency之间的一对多关系。
接下来,在forms.py文件中定义StaffInfoForm和EmergencyForm两个表单类,代码如下:
```python
from django import forms
from .models import StaffInfo, Emergency
class StaffInfoForm(forms.ModelForm):
class Meta:
model = StaffInfo
fields = ['name', 'age', ...]
class EmergencyForm(forms.ModelForm):
class Meta:
model = Emergency
fields = ['name', 'relation', 'address', 'tel', ...]
```
在上面的代码中,我们使用ModelForm来定义表单类,并指定表单中需要显示的字段。
然后,在views.py文件中,我们需要定义两个视图函数,一个用于显示StaffInfo信息和Emergency信息的页面,另一个用于处理表单提交的数据,代码如下:
```python
from django.shortcuts import render, get_object_or_404, redirect
from .models import StaffInfo, Emergency
from .forms import StaffInfoForm, EmergencyForm
def staff_info_detail(request, id):
staff_info = get_object_or_404(StaffInfo, id=id)
emergencies = Emergency.objects.filter(res_id=id)
if request.method == 'POST':
emergency_form = EmergencyForm(request.POST)
if emergency_form.is_valid():
emergency = emergency_form.save(commit=False)
emergency.res_id = staff_info
emergency.save()
return redirect('staff_info_detail', id=id)
else:
emergency_form = EmergencyForm()
return render(request, 'staff_info_detail.html', {'staff_info': staff_info, 'emergencies': emergencies, 'emergency_form': emergency_form})
def add_emergency(request, id):
staff_info = get_object_or_404(StaffInfo, id=id)
if request.method == 'POST':
emergency_form = EmergencyForm(request.POST)
if emergency_form.is_valid():
emergency = emergency_form.save(commit=False)
emergency.res_id = staff_info
emergency.save()
return redirect('staff_info_detail', id=id)
else:
emergency_form = EmergencyForm()
return render(request, 'add_emergency.html', {'staff_info': staff_info, 'emergency_form': emergency_form})
```
在上面的代码中,我们首先通过get_object_or_404函数获取StaffInfo对象,然后使用filter函数获取该StaffInfo对象对应的所有Emergency对象。在staff_info_detail视图函数中,我们首先判断请求的方法是否为POST,如果是,说明用户提交了表单数据,我们需要对数据进行验证并存储到数据库中。如果不是,说明用户还没有提交表单数据,我们需要创建一个空的EmergencyForm对象并将其传递给模板进行渲染。在add_emergency视图函数中,我们用类似的方式处理表单数据,并将用户重定向到staff_info_detail页面以显示更新后的信息。
最后,在staff_info_detail.html和add_emergency.html模板中,我们需要使用Django的模板语言来渲染页面并显示表单,代码如下:
```html
<!-- staff_info_detail.html -->
<h1>{{ staff_info.name }}</h1>
<p>Age: {{ staff_info.age }}</p>
...
<h2>Emergency Contacts</h2>
<ul>
{% for emergency in emergencies %}
<li>{{ emergency.name }}, {{ emergency.tel }}, {{ emergency.relation }}, {{ emergency.address }}</li>
{% endfor %}
</ul>
<form method="POST" action="{% url 'add_emergency' staff_info.id %}">
{% csrf_token %}
{{ emergency_form.as_p }}
<button type="submit">Add</button>
</form>
<!-- add_emergency.html -->
<h1>Add Emergency Contact</h1>
<form method="POST" action="{% url 'add_emergency' staff_info.id %}">
{% csrf_token %}
{{ emergency_form.as_p }}
<button type="submit">Save</button>
</form>
```
在上面的代码中,我们首先使用{{}}语法来显示StaffInfo对象的各个属性。然后,我们使用for语句遍历所有的Emergency对象,并显示它们的各个属性。在表单部分,我们使用{{}}语法将表单对象渲染为HTML代码,并使用{% url %}语法生成正确的表单提交地址。同时,我们需要在表单中包含{% csrf_token %}标签以防止跨站请求伪造攻击。最后,我们使用<button>元素来显示提交按钮。
阅读全文