当我学习django时,我一直在小型django网站上工作。根据文档,当您创建一个带有指向具有外键字段的模型的元类的表单类时,它会将这些字段呈现为选择输入。
在我的应用程序中,我有3个模型client
test
和record
,其中record
带有两个外键,每个外键都指向client
和分别为test
class Client(models.Model):
first = models.CharField(max_length=264)
last = models.CharField(max_length=264)
DOB = models.DateField()
def __str__(self):
return self.first + " " + self.last
class Test(models.Model):
test = models.CharField(max_length=264)
fee = models.DecimalField(max_digits=12, decimal_places=2)
def __str__(self):
return self.test
class Record(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE)
test = models.ForeignKey(Test, on_delete=models.CASCADE)
date = models.DateField()
def __str__(self):
return str(self.date) + " " + str(self.test) + " for " + str(self.client)
class NewLabRecord(forms.ModelForm):
client = forms.ChoiceField(
label='Client ID',
widget=forms.Select(
attrs={'class': 'form-control'}))
test = forms.ChoiceField(
label='Test ID',
widget=forms.Select(
attrs={'class': 'form-control'}))
date = forms.DateField(
label='Test Date',
widget=forms.DateInput(
attrs={'class': 'form-control'}))
class Meta:
model = models.Record
fields = '__all__'
我在NewLabRecord
的索引视图顶部呈现records
。我们的想法是创建一个记录并重定向回页面(因此在记录列表中看到它)。目前,我正在模仿基于类的视图,而不是实际实现它,因为我还没有学习它。不过,这种模式适用于我的client
和test
(代码几乎相同)。
class LabRecord:
@staticmethod
def index(request):
new_record_form = forms.NewLabRecord
records = models.Record.objects.order_by('date')
print(records)
context = {
'records': records,
'new_record_form': new_record_form
}
return render(request, "layouts/lab/record/index.html", context=context)
<div class="collapse" id="createLabRecord">
{% include 'components/lab/record/create.html' %}
</div>
<!DOCTYPE html>
{% block content %}
<div class="card col-sm" style="">
<form class="form" method="post" action="{% url 'lab:create lab record' %}">
{{ new_record_form }}
{% csrf_token %}
<input type="submit" value="submit">
</form>
</div>
{% endblock %}
现在,当我转到此视图的网址/lab/records/
时,视图会呈现两个选择字段和日期输入;但是,选择字段为空!
注意:我在数据库中有9个clients
和4个tests
!
答案 0 :(得分:1)
在您看来,您需要查询客户端和测试模型,并将这些列表放入您的上下文中,以使其可用于您的表单/模板。
records = models.Record.objects.order_by('date')
clients = models.Client.objects.all()
tests = models.Test.objects.all()
context = {
'records': records,
'new_record_form': new_record_form,
'clients' : clients,
'tests' : tests,
}
我还没有学过django的表单部分,还告诉你是否有其他东西可以将列表连接到输入选择字段。
编辑: 看起来您的表单中的以下内容应该可以达到所需:
class NewLabRecord(forms.ModelForm):
client = forms.ModelChoiceField(models.Client.objects.all())
test = forms.ModelChoiceField(models.Test.objects.all())
date = forms.DateField(
label='Test Date',
widget=forms.DateInput(
attrs={'class': 'form-control'}))
class Meta:
model = models.Record
fields = '__all__'
我并不认为您的观点发生变化是必要的。