如何在Django模板中使Modelform可编辑外键字段? [英] How to make a modelform editable foreign key field in a django template?

查看:194
本文介绍了如何在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆