Django,如何将多个表单字段保存到单个模型属性中

时间:2013-07-08 00:01:40

标签: django django-forms django-views django-mptt

我有一个名为Genre(三级层次结构)的树结构,它与用户有很多相关。用户选择流派叶节点。 以下是我的model.py

class Genre(MPTTModel):
    name = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')

    def __unicode__(Self):
        return Self.name

    class MPTTMeta:
        order_insertion_by = ['name']


class UserProfile(BaseModel):
    .....
    genre = models.ManyToManyField(Genre)
    zipcode = models.PositiveIntegerField(default=0)
    about = models.CharField(verbose_name=_('Description'), blank=True)

我分别为每个树叶节点创建了表单字段,因为我想在表单中自定义树渲染。它看起来像这样

class SignupFormStep2(forms.Form):  
   class Meta:
        model = User
        fields = ('date_of_birth', 'gender', 'zipcode',)

    first_name = forms.CharField(label=_('First name'), max_length = 25, initial='', widget=forms.TextInput(attrs={'readonly':'readonly'}))
    last_name = forms.CharField(label=_('Last name'), max_length = 25, initial='', widget=forms.TextInput(attrs={'readonly':'readonly'}))
    email = forms.EmailField(label=_('Email'), max_length = 255, initial='', widget=forms.TextInput(attrs={'readonly':'readonly', 'disabled':True}))
    about = forms.CharField(label=_('Description'), initial='')
    cat=range(0,Genre.tree.filter(level=0).count())
    for x in range(0, len(cat)):
        cat[x]=Genre.tree.filter(level=0)[x]

    subcat=[None]*len(cat)
    for x in range(0, len(cat)):
        subcat[x]=cat[x].get_children()

    genre_0_0=forms.ModelMultipleChoiceField(queryset=cat[0].get_children()[0].get_children(),widget=forms.CheckboxSelectMultiple)

    genre_1_0=forms.ModelMultipleChoiceField(queryset=cat[1].get_children()[0].get_children(),widget=forms.CheckboxSelectMultiple)
    genre_1_1=forms.ModelMultipleChoiceField(queryset=cat[1].get_children()[1].get_children(),widget=forms.CheckboxSelectMultiple)
    genre_1_2=forms.ModelMultipleChoiceField(queryset=cat[1].get_children()[2].get_children(),widget=forms.CheckboxSelectMultiple)
    genre_1_3=forms.ModelMultipleChoiceField(queryset=cat[1].get_children()[3].get_children(),widget=forms.CheckboxSelectMultiple)


    genre_2_0=forms.ModelMultipleChoiceField(queryset=cat[2].get_children()[0].get_children(),widget=forms.CheckboxSelectMultiple)
    genre_2_1=forms.ModelMultipleChoiceField(queryset=cat[2].get_children()[1].get_children(),widget=forms.CheckboxSelectMultiple)

我也使用向导表单进行多次注册,但这不是问题。 我的观点看起来像这样

class SignupWizard(SessionWizardView):

    def get_form_prefix(self, step=None, form=None):
        return ''


    def get_template_names(self):
        return [SIGNUP_TEMPLATES[self.steps.current]]        

    def save_user(self, form_list, **kwargs):
        print 'save_user'
        form_data = [form.cleaned_data for form in form_list]

        session_key = self.request.session.session_key
        try:
            image = UploadProfileImage.objects.get(key=session_key).image
        except UploadProfileImage.DoesNotExist:
            pass

        user = User()

        password = form_data[0]['password1']
        if password:
            user.set_password(password)
        else:
            user.set_unusable_password()

        user.is_active = True
        user.username = (form_data[0]['email']) #temp maybe add user field??
        user.first_name = form_data[0]['first_name']
        user.last_name = form_data[0]['last_name']
        user.email = form_data[0]['email']
        user.save()

        profile = user.profile        

        profile.date_of_birth = form_data[1].get('date_of_birth')
        profile.zipcode = form_data[1].get('zipcode', 0)    
        #profile.genre = form_data[2].save
        profile.genre = Genre.
        #availability
        return user

我不知道如何将所有表单字段(为单个树叶节点生成)保存到视图中的单个用户模型属性类型中。

任何想法如何合并多个表单字段并保存到多个模型属性。

先谢谢。

0 个答案:

没有答案