在 django-forms 中编辑外键
Editing foreign keys in django-forms
我最近接触了 django 和 django 表单。
我想做的是创建一个可以编辑外键的表单。 (我的外键在表单中引用的其他模型的一种形式)。
假设我有这些模型
class Model2(models.Model):
name = models.CharField(max_length=50)
class Model1(models.Model):
type = models.ForeignKey(Model2, on_delete=models.CASCADE)
value = models.CharField(max_length=50)
# other fields
当您呈现 Model1 的表单时,外键也必须是可编辑的。
我想知道这样的事情是否可行
最简单的方法是在您的表单中进行一些自定义处理 - 可能有更好的方法,但我会这样做:
在forms.py
class Model1Form(forms.ModelForm):
type = forms.CharField(label='Name')
class Meta:
model = Model1
fields = ['value', 'type']
def save(self, commit=True):
obj, created = Model2.objects.get_or_create(
name=self.cleaned_data['type']
)
self.cleaned_data['type'] = obj.id
return super().save(commit)
另请注意,您不应使用 type
作为变量名。
您还可以对 Model1
的 type
字段使用 ModelChoiceField
:
class Model1Form(forms.ModelForm):
type = forms.ModelChoiceField(queryset=Model2.objects.all())
class Meta:
model = Model1
field = '__all__'
这将为您提供 Model2
个要用作外键的对象的选择。
我最近接触了 django 和 django 表单。
我想做的是创建一个可以编辑外键的表单。 (我的外键在表单中引用的其他模型的一种形式)。
假设我有这些模型
class Model2(models.Model):
name = models.CharField(max_length=50)
class Model1(models.Model):
type = models.ForeignKey(Model2, on_delete=models.CASCADE)
value = models.CharField(max_length=50)
# other fields
当您呈现 Model1 的表单时,外键也必须是可编辑的。
我想知道这样的事情是否可行
最简单的方法是在您的表单中进行一些自定义处理 - 可能有更好的方法,但我会这样做:
在forms.py
class Model1Form(forms.ModelForm):
type = forms.CharField(label='Name')
class Meta:
model = Model1
fields = ['value', 'type']
def save(self, commit=True):
obj, created = Model2.objects.get_or_create(
name=self.cleaned_data['type']
)
self.cleaned_data['type'] = obj.id
return super().save(commit)
另请注意,您不应使用 type
作为变量名。
您还可以对 Model1
的 type
字段使用 ModelChoiceField
:
class Model1Form(forms.ModelForm):
type = forms.ModelChoiceField(queryset=Model2.objects.all())
class Meta:
model = Model1
field = '__all__'
这将为您提供 Model2
个要用作外键的对象的选择。