以Django模型形式访问外国字段

时间:2019-01-29 19:41:17

标签: python django

我正在创建用户个人资料,其中个人资料与Work_experience具有OnetoMany关系。我尝试过

  

{{form.experience.job_title}}

但是没有用。如何访问Work_Experience字段并将其呈现为TextInput?

Django版本:2.0

模型

class Work_Experience(models.Model):
    job_title      = models.CharField(max_length=100, null=True, blank=True)
    company        = models.CharField(max_length=100, null=True, blank=True)
    description    = models.CharField(max_length=300, null=True, blank=True)
    exp_start_date = models.DateField(null=True, blank=True)
    exp_end_date   = models.DateField(null=True, blank=True)

class Profile(models.Model):
    user            = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    full_name       = models.CharField(max_length=30, null=True, blank=True)
    experience      = models.ForeignKey(Work_Experience, on_delete=models.CASCADE, null=True, blank=True)

    def __str__(self):
        return str(self.user.username)

模板

<div class="field">
    <label>Job title<span class="red-txt">*</span></label>
    {{ form.experience }}
</div>

表格

class ProfileSettingsForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['full_name','experience']

        widgets = {
            'full_name'  : forms.TextInput({'class': 'form-control'}),
            'experience' : forms.TextInput({'class':'form-control'})

        }

1 个答案:

答案 0 :(得分:1)

通过覆盖save()方法解决它。

class ProfileSettingsForm(forms.ModelForm):
    job_title = forms.CharField(max_length=40, required=False)

    def __init__(self, *args, **kwargs):
        super(ProfileSettingsForm, self).__init__(*args, **kwargs)
        self.fields['job_title'].initial = self.instance.experience.job_title

    def save(self, commit=True):
        model = super(ProfileSettingsForm, self).save(commit=False)

        jt = self.cleaned_data['job_title']

        if model.experience:
            model.experience.job_title = jt
            model.experience.save()
        else:
            model.experience = Work_Experience.objects.create(job_title=jt)

        if commit:
            model.save()

        return model

    class Meta:
        model = Profile
        fields = ['full_name']
        widgets = {
            'full_name' : forms.TextInput({'class': 'form-control'}),
        }
相关问题