I have a company model:
class Company(models.Model):
companyId = models.IntegerField(unique=True, blank = True, null = True )
address = models.ForeignKey(Address, blank = True, null = True )
...
and address model:
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)
...
The view for that form is
<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!
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
Template:
<div class="control-group">
{{ form.s_address }}
</div>
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments