繁体   English   中英

使用Django表单更新Django模型

[英]Update Django model using Django forms

我正在尝试在Django中更新用户个人资料。 那就是用户模型和扩展成员模型。

RegistrationForm如下:

class RegistrationForm(forms.Form):
    first_name = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("First name *"), 'class': 'form-control'}))
    last_name = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Last name *"), 'class': 'form-control'}))
    email = forms.EmailField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Email address *"), 'class': 'form-control'}))
    password = forms.CharField(label='', max_length=40, widget=forms.PasswordInput(attrs={'placeholder': _("Password *"), 'class': 'form-control'}))
    password_confirm = forms.CharField(label='', max_length=40, widget=forms.PasswordInput(attrs={'placeholder': _("Re-type your password *"), 'class': 'form-control'}))

    company_name = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Company name *"), 'class': 'form-control'}))
    member_id = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Member number *"), 'class': 'form-control'}))
    vat_number = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("VAT number *"), 'class': 'form-control'}))
    address = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Address *"), 'class': 'form-control'}))
    postcode = forms.CharField(label='', max_length=7, widget=forms.TextInput(attrs={'placeholder': _("Postal code *"), 'class': 'form-control'}))
    city = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("City *"), 'class': 'form-control'}))
    telephone = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Telephone *"), 'class': 'form-control'}))
    mobile = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Mobile *"), 'class': 'form-control'}))

    terms = forms.BooleanField(label="", required=False, widget=forms.CheckboxInput(attrs={'class': 'magic-checkbox'}))

    def clean(self):
        password = self.cleaned_data.get("password")
        password_confirm = self.cleaned_data.get("password_confirm")

        if password != password_confirm:
            msg = _("The passwords do not match.")
            self.add_error('password', msg)
            self.add_error('password_confirm', msg)

    def clean_email(self):
        email = self.cleaned_data['email']
        if User.objects.filter(username=self.cleaned_data['email']).exists():
            raise forms.ValidationError(_("User with the given email address already exists."))
        return email

    def clean_member_id(self):
        member_id = self.cleaned_data['member_id']
        if User.objects.filter(member__number=member_id).exists():
            raise forms.ValidationError(_("User with the given member id already exists."))
        return member_id

    def clean_terms(self):
        terms = self.cleaned_data['terms']
        if not terms:
            raise forms.ValidationError(_("Please read and accept terms and conditions."))
        return terms

注册视图如下:

@transaction.atomic
def new_registration(request):
    context = {}

    if request.method == "POST":
        form = RegistrationForm(request.POST)
        if form.is_valid():
            language = Language.objects.get(key="EN")
            country = Country.objects.get(key="BE")

            user = User()
            user.username = form.cleaned_data['email']
            user.first_name = form.cleaned_data['first_name']
            user.last_name = form.cleaned_data['last_name']
            user.email = form.cleaned_data['email']
            user.set_password(form.cleaned_data['password'])
            user.save()

            member = Member()
            member.company_name = form.cleaned_data['company_name']
            member.number = form.cleaned_data['member_id']
            member.vat_number = form.cleaned_data['vat_number']
            member.address = form.cleaned_data['address']
            member.postcode = form.cleaned_data['postcode']
            member.city = form.cleaned_data['city']
            member.country = country
            member.telephone = form.cleaned_data['telephone']
            member.mobile = form.cleaned_data['mobile']
            member.user = user
            member.language = language
            member.active = False
            member.save()

            subscription = Subscription()
            subscription.started = datetime.date.today()
            subscription.type = Type.objects.get(default=True)
            subscription.member = member
            subscription.save()

            # Send an email to user and to the manager
            send_email_with_template({
                'subject': _("The account is created"),
                'plain_template': 'master/email_templates/account_created_member.txt',
                'html_template': 'master/email_templates/account_created_member.html',
                'data_dict': {'name': user.first_name},
                'send_to': [user.email]
            })

            send_email_with_template({
                'subject': _("A new account is created"),
                'plain_template': 'master/email_templates/account_created_manager.txt',
                'html_template': 'master/email_templates/account_created_manager.html',
                'data_dict': {'user': user, 'member': member},
                'send_to': [settings.EMAIL_MANAGER]
            })

            context['form'] = RegistrationForm()
            context['success'] = _("Your account has been created successfully. "
                                   "Once your information has been processed, your account will be activated.")

            return render(request, 'master/members/new-registration.html', context)
    else:
        form = RegistrationForm()

    context['form'] = form
    return render(request, 'master/members/new-registration.html', context)

我现在要允许用户编辑其个人资料。 但我希望他们只能编辑一些字段,例如first_namelast_namecompany_namevat_number ,...

但是如何使用RegistrationForm做到这一点。

我有如下更新视图:

def update_member_profile(request, user_id):
    member = Member.objects \
        .filter(user_id=user_id) \
        .values('user_id',
                'user__first_name',
                'user__last_name',
                'user__email',
                'telephone',
                'mobile',
                'company_name',
                'vat_number',
                'address',
                'postcode',
                'city'
                )[0]

    context = {'member': member}
    return render(request, 'master/members/profile_update.html', context)

在此视图中,我得到了要编辑的用户,但是现在如何使用RegistrationForm进行操作呢?

有什么建议吗?

在表单字段https://docs.djangoproject.com/en/1.10/ref/forms/fields/中使用disabled属性

class RegistrationForm(forms.Form):
    first_name = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("First name *"), 'class': 'form-control'}))
    last_name = forms.CharField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Last name *"), 'class': 'form-control'}))
    email = forms.EmailField(label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Email address *"), 'class': 'form-control'}))
    password = forms.CharField(label='', max_length=40, widget=forms.PasswordInput(attrs={'placeholder': _("Password *"), 'class': 'form-control'}))
    password_confirm = forms.CharField(label='', max_length=40, widget=forms.PasswordInput(attrs={'placeholder': _("Re-type your password *"), 'class': 'form-control'}))

    company_name = forms.CharField(disabled=True, label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Company name *"), 'class': 'form-control'}))
    member_id = forms.CharField(disabled=True, label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("Member number *"), 'class': 'form-control'}))
    vat_number = forms.CharField(disabled=True, label='', max_length=40, widget=forms.TextInput(attrs={'placeholder': _("VAT number *"), 'class': 'form-control'}))
    ....

仅适用于1.9及更高版本。 另一种解决方案是将所有字段一起从表单中删除,这基本上将其隐藏而不是将其禁用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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