2014-10-08 122 views
2

我创建了一个模型(UserSettings)通过OneToOneField延长Django的用户模型(所推荐的文档):Django的相关模型和更新视图领域

class UserSettings(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    subscribeToMails = models.BooleanField(default=True) 
    [...] 

我希望向我的用户的方式编辑一些他们的个人资料数据,其中一些存储在用户模型(电子邮件地址)中,其余部分存储在UserSettings模型中。我该怎么做?

我想到了两种方法:在UserSettings模型中为电子邮件地址字段添加另一个OneToOneField;或者覆盖UpdateView的get_queryset()方法(但我不知道如何)。是否有最好或推荐的方式来做到这一点?到目前为止,这是我的观点看如何:

class EditUser(UpdateView): 
    model = UserSettings 
    fields = ('emailVisible', 'subscribeToMails', 'mpPopupNotif', 
       'mpEmailNotif', 'avatar', 'quote', 'website') 
    template_name = 'user/edit.html' 

    def get_object(self): 
     return UserSettings.objects.get(user_id=self.request.user) 

    def get_success_url(self): 
     return reverse_lazy('user:edit') 

回答

1

感谢您的答复!然而,因为我无法弄清楚如何使这项工作,并用两个表最终导致太多的杂波我的口味想,我终于去与省事和子类AbstractUser:

# models.py 
class ForumUser(AbstractUser): 
    subscribeToMails = models.BooleanField(default=True) 
    [...] 

# views.py 
class EditUser(LoginRequiredMixin, UpdateView): 
    model = ForumUser 
    fields = ('email', 'emailVisible', 'subscribeToMails', 'mpPopupNotif', 
       'mpEmailNotif', 'avatar', 'quote', 'website') 
    template_name = 'user/edit.html' 
    success_url = reverse_lazy('forum:welcome') 

    def get_object(self): 
     return ForumUser.objects.get(username=self.request.user) 

我只用了改变我的注册表格:

# forms.py 
class RegisterForm(UserCreationForm): 
    email = forms.EmailField(required=True) 

    class Meta: 
     model = ForumUser 
     fields = ('username', 'email', 'password1', 'password2') 

    def clean_email(self): 
     "Ensure registered emails are unique." 
     email = self.cleaned_data.get('email') 
     username = self.cleaned_data.get('username') 
     if email and ForumUser.objects.filter(email=email).exclude(
       username=username).count(): 
      raise forms.ValidationError('Email address already in use.') 
     return email 

    def clean_username(self): 
     """ 
     UserCreationForm method where mentions of the User model are replaced 
     by the custom AbstractUser model (here, ForumUser). 
     https://code.djangoproject.com/ticket/19353#no1 
     and https://docs.djangoproject.com/en/1.7/_modules/django/contrib/ 
     auth/forms/#UserCreationForm 
     """ 
     username = self.cleaned_data["username"] 
     try: 
      ForumUser.objects.get(username=username) 
     except ForumUser.DoesNotExist: 
      return username 
     raise forms.ValidationError(
      self.error_messages['duplicate_username'], 
      code='duplicate_username', 
     ) 
1

使用此解决方案:

的形式像这个混合着UserUserSettings

class EmployeeEditForm(forms.ModelForm): 
    #fields from User model that you want to edit 
    first_name = forms.CharField(required=False, label=_('First Name')) 
    last_name = forms.CharField(required=False, label=_('Last Name')) 

    class Meta: 
     model = UserSettings 
     fields = ('first_name', 'last_name', 'subscribeToMails') 

您可以访问到UserUserSettings对象views.py这样的:

user = request.user 
usersettings = user.usersettings 

现在,您可以编辑User对象是这样的:

user.first_name = request.POST['first_name'] 
user.last_name = request.POST['last_name'] 
user.save() 

和编辑UserSettings这样的:

usersettings.subscribeToMails = request.POST['subscribeToMails'] 
usersettings.save() 
+1

我不明白这应该如何工作。我在视图中将context ['email'] = self.request.user.email'传递给了get_context_data,并通过'form_class = UserEditForm'替换了'model ='。电子邮件字段确实显示为空,但 – 2014-10-09 07:18:24