Django外键选择字段为空

时间:2018-01-20 03:53:26

标签: python django

当我学习django时,我一直在小型django网站上工作。根据文档,当您创建一个带有指向具有外键字段的模型的元类的表单类时,它会将这些字段呈现为选择输入。

在我的应用程序中,我有3个模型client testrecord,其中record带有两个外键,每个外键都指向client和分别为test

Models.py

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)

Form.py

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。我们的想法是创建一个记录并重定向回页面(因此在记录列表中看到它)。目前,我正在模仿基于类的视图,而不是实际实现它,因为我还没有学习它。不过,这种模式适用于我的clienttest(代码几乎相同)。

Views.py

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)

布局/实验室/记录/ index.html中

<div class="collapse" id="createLabRecord">
    {% include 'components/lab/record/create.html' %}
</div>

部件/实验室/记录/ create.html上

<!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

为什么视图为外键字段生成空选择字段?

1 个答案:

答案 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__'

我并不认为您的观点发生变化是必要的。