简体   繁体   中英

How to make a modelform editable foreign key field in a django template?

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM