在Django中添加两个表单域

时间:2014-12-18 16:39:07

标签: python django

我的forms.py中有两个CharField,我的models.py文件中有FirstName和LastName以及CharField FullName。

如何添加两个(FirstName和LastName)并将它们存储为FullName?

我尝试在forms.py(不工作)中执行此操作,因此唯一的另一个选择是在views.py中的POST请求之后更改它但不确定如何更改其内容。

models.py

class UserProfile(models.Model):
    FullName = models.CharField(max_length=10)
    balance = models.IntegerField(default=2000)

    def __unicode__(self):
        return self.user.FullName

forms.py

class UserProfileForm(forms.ModelForm):

    FirstName = forms.CharField()
    LastName = forms.CharField()
    balance = forms.IntegerField(initial=2000,help_text="")

    def clean(self):
        cleaned_data = self.cleaned_data
        url = cleaned_data.get('url')
        if url and not url.startswith('http://'):
            url = 'http://' + url
            cleaned_data['url'] = url

        return cleaned_data

    class Meta:
        model = UserProfile
        fields = ('FullName', 'balance')

views.py

def index(request):
    context = RequestContext(request)

    game_list = Game.objects.all()
    context_dict = {'games': game_list}
    profile_form = UserProfileForm()

    if request.method == 'POST':
        profile_form = UserProfileForm(data=request.POST)
        context_dict = {'games': game_list, 'profile_form':profile_form}

        print profile_form

        if profile_form.is_valid():

            profile = profile_form.save(commit=False)

            profile.save()
            registered = True

        else:
            print profile_form.errors

    return render_to_response('/', context_dict, context)

1 个答案:

答案 0 :(得分:0)

可能最简单的方法是覆盖表单的save方法,填充实例fullname字段

class UserProfileForm(forms.ModelForm):

    FirstName = forms.CharField()
    LastName = forms.CharField()
    balance = forms.IntegerField(initial=2000,help_text="")

    def clean(self):
        cleaned_data = self.cleaned_data
        url = cleaned_data.get('url')
        if url and not url.startswith('http://'):
            url = 'http://' + url
            cleaned_data['url'] = url

        return cleaned_data

    def save(self, commit=True):
        profile = super(UserProfileForm, self).save(commit=False)
        profile.set_fullname(self.cleaned_data["FirstName"], self.cleaned_data["LastName"])
        if commit:
            profile.save()
        return profile 

   class Meta:
        model = UserProfile
        fields = ('balance')

然后在UserProfile模型中,您将有一个set_fullname方法来实现所需的逻辑,例如:

class UserProfile(models.Model):
    # various things ...
    def set_fullname(self, f_name, l_name):
        self.FullName = f_name + ' ' + l_name

此外,我忽略了视图部分,因为我认为它只是一个存根,需要大的改进。