如何在Django模板中使Modelform可编辑外键字段? [英] How to make a modelform editable foreign key field in a django template?
本文介绍了如何在Django模板中使Modelform可编辑外键字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个公司模型:
class Company(models.Model):
companyId = models.IntegerField(unique=True, blank = True, null = True )
address = models.ForeignKey(Address, blank = True, null = True )
...
和地址模型:
class Address(models.Model):
address1 = models.CharField (max_length=300, blank = True, null = True)
...
我需要为外键创建一个可编辑的表单,这是我的代码:
I need to create an editable form for a foreign key and this is my code:
class CompanyForm(forms.ModelForm):
address = forms.CharField(label='Address', max_length=500, required=False)
...
该表格的视图为
<div class="control-group">
<label class="control-label" for="id_address">{{ form.address.label }}</label>
<div class="controls">
{{ form.instance.address.address1 }}
</div>
</div>
显示了地址和标签,但我不能修改该字段。
实际使字段可编辑的方法是什么?
任何帮助表示赞赏!
The address and label is displayed but I cannot modify the field. What would be an approach to actually make the field editable? Any help is appreciated!
推荐答案
要将数据从字符串字段保存到fk,您需要覆盖表单保存方法。您可以在 __ init __
方法中将初始状态设置为字符串地址字段:
To save data from string field to fk you need to override form save method. And you can set initial state to string address field in __init__
method:
class CompanyForm(forms.ModelForm):
s_address = forms.CharField(label='Address', max_length=500, required=False)
def __init__(self, *args, **kwargs):
super(CompanyForm, self).__init__(*args, **kwargs)
self.fields['s_address'].initial = self.instance.address.address1
def save(self, commit=True):
model = super(CompanyForm, self).save(commit=False)
saddr = self.cleaned_data['s_address']
if saddr:
if model.address:
model.address.address1 = saddr
model.address.save()
else:
model.address = Address.objects.create(address1=saddr)
# or you can try to look for appropriate address in Address table first
# try:
# model.address = Address.objects.get(address1=saddr)
# except Address.DoesNotExist:
# model.address = Address.objects.create(address1=saddr)
if commit:
model.save()
return model
class Meta:
exclude = ('address',) # exclude form own address field
模板:
<div class="control-group">
{{ form.s_address }}
</div>
这篇关于如何在Django模板中使Modelform可编辑外键字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文