2012-02-17 2 views
1

Я в тупике!django-profiles и nonetype user

Я создаю форму, которая позволяет пользователю одновременно заполнять поля профиля и поля пользователя. Есть примеры по всей сети для этого и номера на этом сайте (например How to create a UserProfile form in Django with first_name, last_name modifications?)

однако, попробовать, как я мог бы, я продолжаю получать пользователь ни один типа в моем form.py

некоторый код: forms.py

class ProfileForm(ModelForm): 
first_name = forms.CharField(label="First name") 
last_name = forms.CharField(label="Last name") 

def __init__(self, *args, **kwargs): 
    super(ProfileForm, self).__init__(*args, **kwargs) 
    print self.instance #profile does not exist here 
    self.fields['first_name'].initial = self.instance.user.first_name 
    self.fields['last_name'].initial = self.instance.last_name 

def save(self, *args, **kwargs): 
    super(ProfileForm, self).save(*args, **kwargs) 
    self.instance.user.first_name = self.cleaned_data.get('first_name')  
    self.instance.user.last_name = self.cleaned_data.get('last_name') 
    self.instance.user.save() 

class Meta: 
    model = UserProfile 
    exclude = ('user') 

urls.py

url(r'^profiles/edit/', 'profiles.views.edit_profile', {'form_class': ProfileForm}, name='edit_profile'), 

template.html

<div class="clearfix"> 
    <legend>Edit your profile details</legend> 
</div> 
{% include 'profiles/profile_form.html' with user=user %} 

вид происходит из django-профилей, но я даже попытался потянуть в приложение и увидел, что мой пользователь существует и втягивается в экземпляр в представлении, экземпляр лишен пользователя в форме!

Другие примечания: я использую электронную почту в качестве своего метода аутентификации, отличного от имени пользователя, но все равно имею случайное имя пользователя на основе текста (потому что я понимаю, что есть проблемы с сообщениями как имена пользователей в django-профилях). Может ли это быть моей проблемой?

, если его полезным, вот моя Аутентифицировать Защита:

def authenticate(self, username=None, password=None): 
    """ Authenticate a user based on email address as the user name. """ 
    try: 
     user = User.objects.get(email=username) 
     if user.check_password(password): 
      return user 
    except User.DoesNotExist: 
     return None 

def get_user(self, user_id): 
    """ Get a User object from the user_id. """ 
    try: 
     return User.objects.get(pk=user_id) 
    except User.DoesNotExist: 
     return None 

это ссылки в качестве пользовательского бэкэнда, и я подтвердил, что он работает.

Надеюсь, у кого-то есть понимание!

редактирует:

мое полное исключение:

Exception Type: TemplateSyntaxError 
Exception Value: Caught AttributeError while rendering: 'NoneType' object has no attribute 'first_name' 
Exception Location:/Users/willcadell/placespeak/webapps/place/../place/accounts/forms.py in __init__, line 13 

вид (из Джанго профилей):

def edit_profile(request, form_class=None, success_url=None, 
      template_name='profiles/edit_profile.html', 
      extra_context=None): 

    try: 

     profile_obj = request.user.get_profile() 
     print profile_obj #profile is good here 
    except ObjectDoesNotExist: 
     return HttpResponseRedirect(reverse('profiles_create_profile')) 

    if success_url is None: 
     success_url = reverse('profiles_profile_detail', kwargs={ 'username': request.user.username }) 
    if form_class is None: 
     form_class = utils.get_profile_form()  
    if request.method == 'POST': 
     form = form_class(data=request.POST, files=request.FILES, instance=profile_obj) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(success_url) 
    else: 
     form = form_class(instance=profile_obj) 

    if extra_context is None: 
     extra_context = {} 

    context = RequestContext(request) 

    for key, value in extra_context.items(): 
     context[key] = callable(value) and value() or value 

    return render_to_response(template_name, 
          { 'form': form, 
          'profile': profile_obj,}, 
          context_instance=context) 

Я также добавил два замечания с указанием, где профиль существует и где его не является, т. е. находится в представлении как profile_obj, но не появляется в форме как self.instance.

Другим (возможно, не связанным) симптомом является то, что для этой страницы исключения панель инструментов django не отображается ... странно!

+0

Можете ли вы опубликовать свое мнение и полную информацию об исключении. – Meitham

+0

сделали так, спасибо за помощь! –

+0

У вас есть объект профиля для этого пользователя? –

ответ

0

Это то, что я в конечном итоге делает:

вид.ру:

def edit_profile(request): 

profile_obj = request.user.get_profile() 
print dir(profile_obj.profileasset_set) 
asset_obj = profile_obj. 
user_obj = request.user 

if request.method == 'POST': 
    form = ProfileForm(request.POST,) 
    if form.is_valid(): 

     profile_obj.twitter = form.cleaned_data['twitter'] 
     profile_obj.about = form.cleaned_data['about'] 
     profile_obj.url = form.cleaned_data['url'] 
     profile_obj.save() 

     profile 


     user_obj.first_name = form.cleaned_data['first_name'] 
     user_obj.last_name = form.cleaned_data['last_name'] 
     user_obj.save() 

     form.save() 
     return HttpResponseRedirect('/profiles/profile') 

else: 
    form = ProfileForm(instance=user_obj, 
     initial={ 
       'first_name':user_obj.first_name, 
       'last_name':user_obj.last_name, 
       'twitter':profile_obj.twitter, 
       'url':profile_obj.url, 
       'about':profile_obj.about, 
       } 
     ) 

template = 'profiles/edit_profile.html' 
data = {'form': form, }  
return render_to_response(template, data, context_instance=RequestContext(request)) 

forms.py:

class ProfileForm(ModelForm): 

first_name = forms.CharField(label="First name") 
last_name = forms.CharField(label="Last name") 
twitter = forms.CharField(label="Twitter") 
about = forms.CharField(label="About", widget=forms.Textarea) 
url = forms.CharField(label="URL") 

class Meta: 
    model = UserProfile 
    fields = ('url', 'twitter', 'about') 

надеюсь, что это поможет кому-то!

1

Возможно, у вас не всегда есть экземпляр, это может быть причина, по которой он отображается как «Нет». Попробуйте сделать

def __init__(self, *args, **kwargs): 
    super(UserProfileForm, self).__init__(*args, **kwargs) 
    if kwargs.has_key('instance'): 
     instance = kwargs['instance'] 
     self.initial['first_name'] = instance.first_name 
     self.initial['last_name'] = instance.last_name 

Кроме того, вы используете first_name от user объекта, но и last_nameuser_profile от объекта! Я бы просто был последователен. Я использую этот код, чтобы сделать их доступными из обоих мест

# first_name - stores in auth.User 
    def _get_first_name(self): 
     return self.user.first_name 
    def _set_first_name(self, name): 
     self.user.first_name = name 
    first_name = property(_get_first_name, _set_first_name) 

    # last_name - stores in auth.User 
    def _get_last_name(self): 
     return self.user.last_name 
    def _set_last_name(self, name): 
     self.user.last_name = name 
    last_name = property(_get_last_name, _set_last_name) 
+0

Спасибо Мейтам! На самом деле я полностью переписал представление. Тем самым, обращаясь к моей глупой ошибке в отношении first_ и last_name (большое место!), Я также установил исходные значения данных в представлении. –

+0

Meitham, я бы дал вам +1, если бы у меня была репутация :( –

 Смежные вопросы

  • Нет связанных вопросов^_^