2017-04-01 11 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_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を使用することができますか?

アドバイスはありますか?

+0

あなたはどんなdjangoバージョンですか? – Ramast

+0

@Ramast Django versioは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以降でのみ有効です。 別の解決方法は、フォームからフィールドをすべて一緒に削除することです。これを無効にするのではなく、基本的に非表示にします。

関連する問題