📅  最后修改于: 2023-12-03 15:26:34.583000             🧑  作者: Mango
在 Django 中,模型选择字段是一种让用户选择一个模型实例作为字段值的字段类型。对于某些应用程序,可能需要从其他模型中获取选择列表。本文将介绍如何从另一个模型中选择。
首先,我们需要创建两个简单的模型, Person
和 Group
,具体代码如下:
from django.db import models
class Group(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Person(models.Model):
name = models.CharField(max_length=50)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
def __str__(self):
return self.name
在这两个模型中,Group
模型包含一个名称字段,并且 Person
模型具有与 Group
模型的外键关联。
现在,我们将创建一个新模型 Membership
,该模型将具有两个外键关联,一个相关 Person
模型实例,另一个与 Group
模型实例相关联。具体代码如下:
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
def __str__(self):
return f'{self.person.name} is in {self.group.name}'
在这个新模型中,我们创建了两个外键关联字段,一个来自 Person
模型,另一个来自 Group
模型。这个模型将允许我们跟踪一个人是属于哪个组的。
接下来,我们将创建一个表单以显示并选择 Membership
记录。该表单将显示一个下拉列表,其中包含所有可用的 Group
。
from django import forms
class MembershipForm(forms.ModelForm):
group = forms.ModelChoiceField(queryset=Group.objects.all())
class Meta:
model = Membership
fields = ('group',)
在这个表单中,我们从 Group
模型中获取所有记录,并将其作为下拉列表的选项。此外,我们将 group
字段添加到 Membership
模型中,以返回对应的记录。
现在,我们将创建一个视图以呈现表单和保存选择。具体代码如下:
from django.shortcuts import render, redirect
from .forms import MembershipForm
def add_membership(request):
if request.method == 'POST':
form = MembershipForm(request.POST)
if form.is_valid():
membership = form.save(commit=False)
membership.person = request.user.person
membership.save()
return redirect('success')
else:
form = MembershipForm()
return render(request, 'add_membership.html', {'form': form})
在代码中,我们接受表单并在用户提交表单时做出反应。如果表单有效,则创建新的 Membership
记录。此外,我们设置 person
字段为当前用户的 Person
对象。最后,我们重定向到成功页面。如果请求是 GET 请求,则创建空表单以显示。
使用 ModelChoiceField
,我们可以轻松地从另一个模型中选择记录。虽然本文提供的例子可能过于简单,但这种方法在更大型的应用中非常有用。