2017-04-01 89 views
0

我試圖更新Django中的用戶配置文件。這是用戶模型和擴展成員模型。使用Django窗體更新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_name,last_name,company_name,vat_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這樣做呢?

有什麼建議嗎?

+0

你用什麼django版本? – Ramast

+0

@Ramast Django版本是1.10.5 – Boky

回答

0

使用disabled在你的表單字段 https://docs.djangoproject.com/en/1.10/ref/forms/fields/

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及以後的版本。 另一個解決方案是從字段中刪除字段,它們將基本隱藏起來而不是禁用它