2017-01-03 2 views
-1

Django-userena를 사용하여 사용자 프로필 동작을 확장하고 있습니다.이 예제에서 django 사용자 프로필에 필드를 추가하는 방법은 무엇입니까?

내가하려는 것은 userena/forms.py의 edit_profile 함수를 재정의하거나 my myapp/forms.py에서 처리하는 것입니다.

myapp/models.py에서 양식에 포함하려는 새 필드를 추가했습니다.

models.py

class MyProfile(UserenaBaseProfile): 
    user = models.OneToOneField(User,unique=True,verbose_name=_('user'),related_name='my_profile') 
    storename=models.CharField(null=True, blank=True, max_length=20) 
    streetaddress=models.CharField(null=True, blank=True, max_length=30) 
    city = models.CharField(null=True, blank=True, max_length=20) 
    state = models.CharField(null=True, blank=True, max_length=20) 
    zipcode = models.IntegerField(_('zipcode'),null=True, blank=True) 
    nearbyzips1=models.IntegerField(null=True, blank=True) 
    nearbyzips2=models.IntegerField(null=True, blank=True) 

이러한 특성을 저장 내가 userena에 하나 양식 또는 views.py에 무엇을 추가하려면 어떻게해야합니까 내 질문?

userena/forms.py

class EditProfileForm(forms.ModelForm): 
    """ Base form used for fields that are always required """ 
    first_name = forms.CharField(label=_('First name'),max_length=30,required=False) 
    last_name = forms.CharField(label=_('Last name'),max_length=30,required=False) 

    def __init__(self, *args, **kw): 
     super(EditProfileForm, self).__init__(*args, **kw) 
     # Put the first and last name at the top 
     try: # in Django < 1.7 
      new_order = self.fields.keyOrder[:-2] 
      new_order.insert(0, 'first_name') 
      new_order.insert(1, 'last_name') 
      self.fields.keyOrder = new_order 
     except AttributeError: # in Django > 1.7 
      new_order = [('first_name', self.fields['first_name']), ('last_name', self.fields['last_name'])] 
      new_order.extend(list(self.fields.items())[:-2]) 
      self.fields = OrderedDict(new_order) 

    class Meta: 
     model = get_profile_model() 
     exclude = ['user'] 

    def save(self, force_insert=False, force_update=False, commit=True): 
     profile = super(EditProfileForm, self).save(commit=commit) 
     # Save first and last name 
     user = profile.user 
     user.first_name = self.cleaned_data['first_name'] 
     user.last_name = self.cleaned_data['last_name'] 
     user.save() 
     return profile 

나는 단순히

user.storename = self.cleaned_data['storename'] 
user.streetaddress = self.cleaned_data['streetaddress'] 

요법 추가 .. 아니면 거기 더 할 수 있습니까?

userena/views.py

@permission_required_or_403('change_profile', (get_profile_model(), 'user__username', 'username'))  
def profile_edit(request, username, edit_profile_form=EditProfileForm,template_name='userena/profile_form.html', success_url=None,extra_context=None, **kwargs): 

    user = get_object_or_404(get_user_model(), username__iexact=username)   
    profile = get_user_profile(user=user) 
    user_initial = {'first_name': user.first_name,'last_name': user.last_name} 
    form = edit_profile_form(instance=profile, initial=user_initial) 

    if request.method == 'POST':  
     form = edit_profile_form(request.POST, request.FILES, instance=profile, initial=user_initial) 

     if form.is_valid():  
      profile = form.save() 

      if userena_settings.USERENA_USE_MESSAGES:  
       messages.success(request, _('Your profile has been updated.'), fail_silently=True) 

      if success_url:  
       # Send a signal that the profile has changed  
       userena_signals.profile_change.send(sender=None, user=user) 
       redirect_to = success_url 
      else: 
       redirect_to = reverse('userena_profile_detail', kwargs={'username': username}) 

      return redirect(redirect_to) 

    if not extra_context: 
     extra_context = dict() 

    extra_context['form'] = form 
    extra_context['profile'] = profile 

    return ExtraContextTemplateView.as_view(template_name=template_name,extra_context=extra_context)(request) 

답변

0

당신의 MyProfile 클래스는 모델은 양식에서 내장 된 모델이 될 것이다 다음 (이 코드에서 명확하지 않다) get_profile_model()에 의해 반환되는 경우 . 그런 다음 양식의 추가 필드를 볼 수 있어야하며 양식을 저장하면 모델이 저장됩니다. 즉 사용자가 아닌 프로파일에 해당 속성을 저장 이후, 사실, 그 어쨌든 잘못된 것

user.storename = self.cleaned_data['storename'] 
user.streetaddress = self.cleaned_data['streetaddress'] 

:

당신은 같은 것을 할 필요가 없습니다한다.

class MyProfileForm(forms.ModelForm): 
    class Meta: 
     model = MyProfile 
     exclude = ['user'] 

을 그리고 그게 다야 : 당신이 예에서 해당 양식을 구축 한 것처럼 당신이 정말로 그 성과 이름의 물건을 사용하지 않으려면, 내가 다시 작성 제안, 그래서 그것이 훨씬 간단하게 보인다.